github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/client/status_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package client_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  
    10  	"github.com/juju/juju/apiserver/charmrevisionupdater"
    11  	"github.com/juju/juju/apiserver/charmrevisionupdater/testing"
    12  	"github.com/juju/juju/apiserver/client"
    13  	"github.com/juju/juju/apiserver/common"
    14  	"github.com/juju/juju/apiserver/params"
    15  	apiservertesting "github.com/juju/juju/apiserver/testing"
    16  	"github.com/juju/juju/instance"
    17  	jujutesting "github.com/juju/juju/juju/testing"
    18  	"github.com/juju/juju/state"
    19  	"github.com/juju/juju/testing/factory"
    20  )
    21  
    22  type statusSuite struct {
    23  	baseSuite
    24  }
    25  
    26  var _ = gc.Suite(&statusSuite{})
    27  
    28  func (s *statusSuite) addMachine(c *gc.C) *state.Machine {
    29  	machine, err := s.State.AddMachine("quantal", state.JobHostUnits)
    30  	c.Assert(err, jc.ErrorIsNil)
    31  	return machine
    32  }
    33  
    34  // Complete testing of status functionality happens elsewhere in the codebase,
    35  // these tests just sanity-check the api itself.
    36  
    37  func (s *statusSuite) TestFullStatus(c *gc.C) {
    38  	machine := s.addMachine(c)
    39  	client := s.APIState.Client()
    40  	status, err := client.Status(nil)
    41  	c.Assert(err, jc.ErrorIsNil)
    42  	c.Check(status.ModelName, gc.Equals, "admin")
    43  	c.Check(status.Services, gc.HasLen, 0)
    44  	c.Check(status.Machines, gc.HasLen, 1)
    45  	resultMachine, ok := status.Machines[machine.Id()]
    46  	if !ok {
    47  		c.Fatalf("Missing machine with id %q", machine.Id())
    48  	}
    49  	c.Check(resultMachine.Id, gc.Equals, machine.Id())
    50  	c.Check(resultMachine.Series, gc.Equals, machine.Series())
    51  }
    52  
    53  var _ = gc.Suite(&statusUnitTestSuite{})
    54  
    55  type statusUnitTestSuite struct {
    56  	baseSuite
    57  	*factory.Factory
    58  }
    59  
    60  func (s *statusUnitTestSuite) SetUpTest(c *gc.C) {
    61  	s.baseSuite.SetUpTest(c)
    62  	// State gets reset per test, so must the factory.
    63  	s.Factory = factory.NewFactory(s.State)
    64  }
    65  
    66  func (s *statusUnitTestSuite) TestProcessMachinesWithOneMachineAndOneContainer(c *gc.C) {
    67  	host := s.MakeMachine(c, &factory.MachineParams{InstanceId: instance.Id("0")})
    68  	container := s.MakeMachineNested(c, host.Id(), nil)
    69  	machines := map[string][]*state.Machine{
    70  		host.Id(): {host, container},
    71  	}
    72  
    73  	statuses := client.ProcessMachines(machines)
    74  	c.Assert(statuses, gc.Not(gc.IsNil))
    75  
    76  	containerStatus := client.MakeMachineStatus(container)
    77  	c.Check(statuses[host.Id()].Containers[container.Id()].Id, gc.Equals, containerStatus.Id)
    78  }
    79  
    80  func (s *statusUnitTestSuite) TestProcessMachinesWithEmbeddedContainers(c *gc.C) {
    81  	host := s.MakeMachine(c, &factory.MachineParams{InstanceId: instance.Id("1")})
    82  	lxcHost := s.MakeMachineNested(c, host.Id(), nil)
    83  	machines := map[string][]*state.Machine{
    84  		host.Id(): {
    85  			host,
    86  			lxcHost,
    87  			s.MakeMachineNested(c, lxcHost.Id(), nil),
    88  			s.MakeMachineNested(c, host.Id(), nil),
    89  		},
    90  	}
    91  
    92  	statuses := client.ProcessMachines(machines)
    93  	c.Assert(statuses, gc.Not(gc.IsNil))
    94  
    95  	hostContainer := statuses[host.Id()].Containers
    96  	c.Check(hostContainer, gc.HasLen, 2)
    97  	c.Check(hostContainer[lxcHost.Id()].Containers, gc.HasLen, 1)
    98  }
    99  
   100  var testUnits = []struct {
   101  	unitName       string
   102  	setStatus      *state.MeterStatus
   103  	expectedStatus *params.MeterStatus
   104  }{{
   105  	setStatus:      &state.MeterStatus{Code: state.MeterGreen, Info: "test information"},
   106  	expectedStatus: &params.MeterStatus{Color: "green", Message: "test information"},
   107  }, {
   108  	setStatus:      &state.MeterStatus{Code: state.MeterAmber, Info: "test information"},
   109  	expectedStatus: &params.MeterStatus{Color: "amber", Message: "test information"},
   110  }, {
   111  	setStatus:      &state.MeterStatus{Code: state.MeterRed, Info: "test information"},
   112  	expectedStatus: &params.MeterStatus{Color: "red", Message: "test information"},
   113  }, {
   114  	setStatus:      &state.MeterStatus{Code: state.MeterGreen, Info: "test information"},
   115  	expectedStatus: &params.MeterStatus{Color: "green", Message: "test information"},
   116  }, {},
   117  }
   118  
   119  func (s *statusUnitTestSuite) TestMeterStatus(c *gc.C) {
   120  	service := s.MakeService(c, nil)
   121  
   122  	units, err := service.AllUnits()
   123  	c.Assert(err, jc.ErrorIsNil)
   124  	c.Assert(units, gc.HasLen, 0)
   125  
   126  	for i, unit := range testUnits {
   127  		u, err := service.AddUnit()
   128  		testUnits[i].unitName = u.Name()
   129  		c.Assert(err, jc.ErrorIsNil)
   130  		if unit.setStatus != nil {
   131  			err := u.SetMeterStatus(unit.setStatus.Code.String(), unit.setStatus.Info)
   132  			c.Assert(err, jc.ErrorIsNil)
   133  		}
   134  	}
   135  
   136  	client := s.APIState.Client()
   137  	status, err := client.Status(nil)
   138  	c.Assert(err, jc.ErrorIsNil)
   139  	c.Assert(status, gc.NotNil)
   140  	serviceStatus, ok := status.Services[service.Name()]
   141  	c.Assert(ok, gc.Equals, true)
   142  
   143  	c.Assert(serviceStatus.MeterStatuses, gc.HasLen, len(testUnits)-1)
   144  	for _, unit := range testUnits {
   145  		unitStatus, ok := serviceStatus.MeterStatuses[unit.unitName]
   146  
   147  		if unit.expectedStatus != nil {
   148  			c.Assert(ok, gc.Equals, true)
   149  			c.Assert(&unitStatus, gc.DeepEquals, unit.expectedStatus)
   150  		} else {
   151  			c.Assert(ok, gc.Equals, false)
   152  		}
   153  	}
   154  }
   155  
   156  type statusUpgradeUnitSuite struct {
   157  	testing.CharmSuite
   158  	jujutesting.JujuConnSuite
   159  
   160  	charmrevisionupdater *charmrevisionupdater.CharmRevisionUpdaterAPI
   161  	resources            *common.Resources
   162  	authoriser           apiservertesting.FakeAuthorizer
   163  }
   164  
   165  var _ = gc.Suite(&statusUpgradeUnitSuite{})
   166  
   167  func (s *statusUpgradeUnitSuite) SetUpSuite(c *gc.C) {
   168  	s.JujuConnSuite.SetUpSuite(c)
   169  	s.CharmSuite.SetUpSuite(c, &s.JujuConnSuite)
   170  }
   171  
   172  func (s *statusUpgradeUnitSuite) TearDownSuite(c *gc.C) {
   173  	s.CharmSuite.TearDownSuite(c)
   174  	s.JujuConnSuite.TearDownSuite(c)
   175  }
   176  
   177  func (s *statusUpgradeUnitSuite) SetUpTest(c *gc.C) {
   178  	s.JujuConnSuite.SetUpTest(c)
   179  	s.CharmSuite.SetUpTest(c)
   180  	s.resources = common.NewResources()
   181  	s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() })
   182  	s.authoriser = apiservertesting.FakeAuthorizer{
   183  		EnvironManager: true,
   184  	}
   185  	var err error
   186  	s.charmrevisionupdater, err = charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, s.authoriser)
   187  	c.Assert(err, jc.ErrorIsNil)
   188  }
   189  
   190  func (s *statusUpgradeUnitSuite) TearDownTest(c *gc.C) {
   191  	s.CharmSuite.TearDownTest(c)
   192  	s.JujuConnSuite.TearDownTest(c)
   193  }
   194  
   195  func (s *statusUpgradeUnitSuite) TestUpdateRevisions(c *gc.C) {
   196  	s.AddMachine(c, "0", state.JobManageModel)
   197  	s.SetupScenario(c)
   198  	client := s.APIState.Client()
   199  	status, _ := client.Status(nil)
   200  
   201  	serviceStatus, ok := status.Services["mysql"]
   202  	c.Assert(ok, gc.Equals, true)
   203  	c.Assert(serviceStatus.CanUpgradeTo, gc.Equals, "")
   204  
   205  	// Update to the latest available charm revision.
   206  	result, err := s.charmrevisionupdater.UpdateLatestRevisions()
   207  	c.Assert(err, jc.ErrorIsNil)
   208  	c.Assert(result.Error, gc.IsNil)
   209  
   210  	// Check if CanUpgradeTo suggest the latest revision.
   211  	status, _ = client.Status(nil)
   212  	serviceStatus, ok = status.Services["mysql"]
   213  	c.Assert(ok, gc.Equals, true)
   214  	c.Assert(serviceStatus.CanUpgradeTo, gc.Equals, "cs:quantal/mysql-23")
   215  }