github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/api/controller/controller_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package controller_test
     5  
     6  import (
     7  	"fmt"
     8  	"time"
     9  
    10  	"github.com/juju/errors"
    11  	"github.com/juju/names"
    12  	jc "github.com/juju/testing/checkers"
    13  	"github.com/juju/utils"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/api/base"
    17  	"github.com/juju/juju/api/controller"
    18  	commontesting "github.com/juju/juju/apiserver/common/testing"
    19  	"github.com/juju/juju/apiserver/params"
    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 controllerSuite struct {
    28  	jujutesting.JujuConnSuite
    29  	commontesting.BlockHelper
    30  }
    31  
    32  var _ = gc.Suite(&controllerSuite{})
    33  
    34  func (s *controllerSuite) SetUpTest(c *gc.C) {
    35  	s.JujuConnSuite.SetUpTest(c)
    36  }
    37  
    38  func (s *controllerSuite) OpenAPI(c *gc.C) *controller.Client {
    39  	return controller.NewClient(s.APIState)
    40  }
    41  
    42  func (s *controllerSuite) TestAllModels(c *gc.C) {
    43  	owner := names.NewUserTag("user@remote")
    44  	s.Factory.MakeModel(c, &factory.ModelParams{
    45  		Name: "first", Owner: owner}).Close()
    46  	s.Factory.MakeModel(c, &factory.ModelParams{
    47  		Name: "second", Owner: owner}).Close()
    48  
    49  	sysManager := s.OpenAPI(c)
    50  	envs, err := sysManager.AllModels()
    51  	c.Assert(err, jc.ErrorIsNil)
    52  	c.Assert(envs, gc.HasLen, 3)
    53  
    54  	var obtained []string
    55  	for _, env := range envs {
    56  		obtained = append(obtained, fmt.Sprintf("%s/%s", env.Owner, env.Name))
    57  	}
    58  	expected := []string{
    59  		"admin@local/admin",
    60  		"user@remote/first",
    61  		"user@remote/second",
    62  	}
    63  	c.Assert(obtained, jc.SameContents, expected)
    64  }
    65  
    66  func (s *controllerSuite) TestModelConfig(c *gc.C) {
    67  	sysManager := s.OpenAPI(c)
    68  	env, err := sysManager.ModelConfig()
    69  	c.Assert(err, jc.ErrorIsNil)
    70  	c.Assert(env["name"], gc.Equals, "admin")
    71  }
    72  
    73  func (s *controllerSuite) TestDestroyController(c *gc.C) {
    74  	st := s.Factory.MakeModel(c, &factory.ModelParams{Name: "foo"})
    75  	factory.NewFactory(st).MakeMachine(c, nil) // make it non-empty
    76  	st.Close()
    77  
    78  	sysManager := s.OpenAPI(c)
    79  	err := sysManager.DestroyController(false)
    80  	c.Assert(err, gc.ErrorMatches, `failed to destroy model: hosting 1 other models \(controller has hosted models\)`)
    81  }
    82  
    83  func (s *controllerSuite) TestListBlockedModels(c *gc.C) {
    84  	err := s.State.SwitchBlockOn(state.ChangeBlock, "change block for controller")
    85  	err = s.State.SwitchBlockOn(state.DestroyBlock, "destroy block for controller")
    86  	c.Assert(err, jc.ErrorIsNil)
    87  
    88  	sysManager := s.OpenAPI(c)
    89  	results, err := sysManager.ListBlockedModels()
    90  	c.Assert(err, jc.ErrorIsNil)
    91  	c.Assert(results, jc.DeepEquals, []params.ModelBlockInfo{
    92  		params.ModelBlockInfo{
    93  			Name:     "admin",
    94  			UUID:     s.State.ModelUUID(),
    95  			OwnerTag: s.AdminUserTag(c).String(),
    96  			Blocks: []string{
    97  				"BlockChange",
    98  				"BlockDestroy",
    99  			},
   100  		},
   101  	})
   102  }
   103  
   104  func (s *controllerSuite) TestRemoveBlocks(c *gc.C) {
   105  	s.State.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyModel")
   106  	s.State.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock")
   107  
   108  	sysManager := s.OpenAPI(c)
   109  	err := sysManager.RemoveBlocks()
   110  	c.Assert(err, jc.ErrorIsNil)
   111  
   112  	blocks, err := s.State.AllBlocksForController()
   113  	c.Assert(err, jc.ErrorIsNil)
   114  	c.Assert(blocks, gc.HasLen, 0)
   115  }
   116  
   117  func (s *controllerSuite) TestWatchAllModels(c *gc.C) {
   118  	// The WatchAllModels infrastructure is comprehensively tested
   119  	// else. This test just ensure that the API calls work end-to-end.
   120  	sysManager := s.OpenAPI(c)
   121  
   122  	w, err := sysManager.WatchAllModels()
   123  	c.Assert(err, jc.ErrorIsNil)
   124  	defer func() {
   125  		err := w.Stop()
   126  		c.Assert(err, jc.ErrorIsNil)
   127  	}()
   128  
   129  	deltasC := make(chan []multiwatcher.Delta)
   130  	go func() {
   131  		deltas, err := w.Next()
   132  		c.Assert(err, jc.ErrorIsNil)
   133  		deltasC <- deltas
   134  	}()
   135  
   136  	select {
   137  	case deltas := <-deltasC:
   138  		c.Assert(deltas, gc.HasLen, 1)
   139  		modelInfo := deltas[0].Entity.(*multiwatcher.ModelInfo)
   140  
   141  		env, err := s.State.Model()
   142  		c.Assert(err, jc.ErrorIsNil)
   143  
   144  		c.Assert(modelInfo.ModelUUID, gc.Equals, env.UUID())
   145  		c.Assert(modelInfo.Name, gc.Equals, env.Name())
   146  		c.Assert(modelInfo.Life, gc.Equals, multiwatcher.Life("alive"))
   147  		c.Assert(modelInfo.Owner, gc.Equals, env.Owner().Id())
   148  		c.Assert(modelInfo.ServerUUID, gc.Equals, env.ControllerUUID())
   149  	case <-time.After(testing.LongWait):
   150  		c.Fatal("timed out")
   151  	}
   152  }
   153  
   154  func (s *controllerSuite) TestModelStatus(c *gc.C) {
   155  	controller := s.OpenAPI(c)
   156  	modelTag := s.State.ModelTag()
   157  	results, err := controller.ModelStatus(modelTag)
   158  	c.Assert(err, jc.ErrorIsNil)
   159  	c.Assert(results, jc.DeepEquals, []base.ModelStatus{{
   160  		UUID:               modelTag.Id(),
   161  		HostedMachineCount: 0,
   162  		ServiceCount:       0,
   163  		Owner:              "admin@local",
   164  		Life:               params.Alive,
   165  	}})
   166  }
   167  
   168  func (s *controllerSuite) TestInitiateModelMigration(c *gc.C) {
   169  	st := s.Factory.MakeModel(c, nil)
   170  	defer st.Close()
   171  
   172  	_, err := st.GetModelMigration()
   173  	c.Assert(errors.IsNotFound(err), jc.IsTrue)
   174  
   175  	spec := controller.ModelMigrationSpec{
   176  		ModelUUID:            st.ModelUUID(),
   177  		TargetControllerUUID: randomUUID(),
   178  		TargetAddrs:          []string{"1.2.3.4:5"},
   179  		TargetCACert:         "cert",
   180  		TargetUser:           "someone",
   181  		TargetPassword:       "secret",
   182  	}
   183  
   184  	controller := s.OpenAPI(c)
   185  	id, err := controller.InitiateModelMigration(spec)
   186  	c.Assert(err, jc.ErrorIsNil)
   187  	expectedId := st.ModelUUID() + ":0"
   188  	c.Check(id, gc.Equals, expectedId)
   189  
   190  	// Check database.
   191  	mig, err := st.GetModelMigration()
   192  	c.Assert(err, jc.ErrorIsNil)
   193  	c.Check(mig.Id(), gc.Equals, expectedId)
   194  }
   195  
   196  func (s *controllerSuite) TestInitiateModelMigrationError(c *gc.C) {
   197  	spec := controller.ModelMigrationSpec{
   198  		ModelUUID:            randomUUID(), // Model doesn't exist.
   199  		TargetControllerUUID: randomUUID(),
   200  		TargetAddrs:          []string{"1.2.3.4:5"},
   201  		TargetCACert:         "cert",
   202  		TargetUser:           "someone",
   203  		TargetPassword:       "secret",
   204  	}
   205  
   206  	controller := s.OpenAPI(c)
   207  	id, err := controller.InitiateModelMigration(spec)
   208  	c.Check(id, gc.Equals, "")
   209  	c.Check(err, gc.ErrorMatches, "unable to read model: .+")
   210  }
   211  
   212  func randomUUID() string {
   213  	return utils.MustNewUUID().String()
   214  }