github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/upgradeseries/upgradeseries_test.go (about)

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package upgradeseries_test
     5  
     6  import (
     7  	"github.com/golang/mock/gomock"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  	"gopkg.in/juju/names.v2"
    11  
    12  	"github.com/juju/juju/apiserver/common"
    13  	"github.com/juju/juju/apiserver/common/mocks"
    14  	"github.com/juju/juju/apiserver/facades/agent/upgradeseries"
    15  	"github.com/juju/juju/apiserver/params"
    16  	apiservertesting "github.com/juju/juju/apiserver/testing"
    17  	"github.com/juju/juju/core/model"
    18  	"github.com/juju/juju/state"
    19  	"github.com/juju/juju/testing"
    20  )
    21  
    22  type upgradeSeriesSuite struct {
    23  	testing.BaseSuite
    24  
    25  	backend *mocks.MockUpgradeSeriesBackend
    26  	machine *mocks.MockUpgradeSeriesMachine
    27  
    28  	entityArgs                           params.Entities
    29  	upgradeSeriesStatusArgs              params.UpgradeSeriesStatusParams
    30  	upgradeSeriesStartUnitCompletionArgs params.UpgradeSeriesStartUnitCompletionParam
    31  
    32  	api *upgradeseries.API
    33  
    34  	machineTag names.MachineTag
    35  	unitTag    names.UnitTag
    36  }
    37  
    38  var _ = gc.Suite(&upgradeSeriesSuite{})
    39  
    40  func (s *upgradeSeriesSuite) SetUpTest(c *gc.C) {
    41  	s.BaseSuite.SetUpTest(c)
    42  
    43  	s.machineTag = names.NewMachineTag("0")
    44  	s.unitTag = names.NewUnitTag("redis/0")
    45  
    46  	s.entityArgs = params.Entities{Entities: []params.Entity{{Tag: s.machineTag.String()}}}
    47  	s.upgradeSeriesStatusArgs = params.UpgradeSeriesStatusParams{
    48  		Params: []params.UpgradeSeriesStatusParam{
    49  			{
    50  				Entity: params.Entity{Tag: s.machineTag.String()},
    51  			},
    52  		},
    53  	}
    54  	s.upgradeSeriesStartUnitCompletionArgs = params.UpgradeSeriesStartUnitCompletionParam{
    55  		Entities: []params.Entity{{Tag: s.machineTag.String()}},
    56  	}
    57  }
    58  
    59  func (s *upgradeSeriesSuite) TestMachineStatus(c *gc.C) {
    60  	defer s.arrangeTest(c).Finish()
    61  
    62  	s.machine.EXPECT().UpgradeSeriesStatus().Return(model.UpgradeSeriesPrepareCompleted, nil)
    63  
    64  	results, err := s.api.MachineStatus(s.entityArgs)
    65  	c.Assert(err, jc.ErrorIsNil)
    66  	c.Assert(results, gc.DeepEquals, params.UpgradeSeriesStatusResults{
    67  		Results: []params.UpgradeSeriesStatusResult{{Status: model.UpgradeSeriesPrepareCompleted}},
    68  	})
    69  }
    70  
    71  func (s *upgradeSeriesSuite) TestSetMachineStatus(c *gc.C) {
    72  	defer s.arrangeTest(c).Finish()
    73  
    74  	s.machine.EXPECT().SetUpgradeSeriesStatus(model.UpgradeSeriesPrepareCompleted, gomock.Any()).Return(nil)
    75  
    76  	entity := params.Entity{Tag: s.machineTag.String()}
    77  	args := params.UpgradeSeriesStatusParams{
    78  		Params: []params.UpgradeSeriesStatusParam{{Entity: entity, Status: model.UpgradeSeriesPrepareCompleted}},
    79  	}
    80  
    81  	results, err := s.api.SetMachineStatus(args)
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	c.Assert(results, gc.DeepEquals, params.ErrorResults{
    84  		Results: []params.ErrorResult{{}},
    85  	})
    86  }
    87  
    88  func (s *upgradeSeriesSuite) TestUpgradeSeriesTarget(c *gc.C) {
    89  	defer s.arrangeTest(c).Finish()
    90  
    91  	s.machine.EXPECT().UpgradeSeriesTarget().Return("bionic", nil)
    92  
    93  	results, err := s.api.TargetSeries(s.entityArgs)
    94  	c.Assert(err, jc.ErrorIsNil)
    95  	c.Assert(results, gc.DeepEquals, params.StringResults{
    96  		Results: []params.StringResult{{Result: "bionic"}},
    97  	})
    98  }
    99  
   100  func (s *upgradeSeriesSuite) TestStartUnitCompletion(c *gc.C) {
   101  	defer s.arrangeTest(c).Finish()
   102  
   103  	s.machine.EXPECT().StartUpgradeSeriesUnitCompletion(gomock.Any()).Return(nil)
   104  
   105  	results, err := s.api.StartUnitCompletion(s.upgradeSeriesStartUnitCompletionArgs)
   106  	c.Assert(err, jc.ErrorIsNil)
   107  	c.Assert(results, gc.DeepEquals, params.ErrorResults{
   108  		Results: []params.ErrorResult{{}},
   109  	})
   110  }
   111  
   112  func (s *upgradeSeriesSuite) TestUnitsPrepared(c *gc.C) {
   113  	defer s.arrangeTest(c).Finish()
   114  
   115  	s.machine.EXPECT().UpgradeSeriesUnitStatuses().Return(map[string]state.UpgradeSeriesUnitStatus{
   116  		"redis/0": {Status: model.UpgradeSeriesPrepareCompleted},
   117  		"redis/1": {Status: model.UpgradeSeriesPrepareStarted},
   118  	}, nil)
   119  
   120  	results, err := s.api.UnitsPrepared(s.entityArgs)
   121  	c.Assert(err, jc.ErrorIsNil)
   122  	c.Assert(results, gc.DeepEquals, params.EntitiesResults{
   123  		Results: []params.EntitiesResult{{Entities: []params.Entity{{Tag: s.unitTag.String()}}}},
   124  	})
   125  }
   126  
   127  func (s *upgradeSeriesSuite) TestUnitsCompleted(c *gc.C) {
   128  	defer s.arrangeTest(c).Finish()
   129  
   130  	s.machine.EXPECT().UpgradeSeriesUnitStatuses().Return(map[string]state.UpgradeSeriesUnitStatus{
   131  		"redis/0": {Status: model.UpgradeSeriesCompleted},
   132  		"redis/1": {Status: model.UpgradeSeriesCompleteStarted},
   133  	}, nil)
   134  
   135  	results, err := s.api.UnitsCompleted(s.entityArgs)
   136  	c.Assert(err, jc.ErrorIsNil)
   137  	c.Assert(results, gc.DeepEquals, params.EntitiesResults{
   138  		Results: []params.EntitiesResult{{Entities: []params.Entity{{Tag: s.unitTag.String()}}}},
   139  	})
   140  }
   141  
   142  func (s *upgradeSeriesSuite) TestFinishUpgradeSeriesUpgraded(c *gc.C) {
   143  	defer s.arrangeTest(c).Finish()
   144  
   145  	exp := s.machine.EXPECT()
   146  	exp.Series().Return("trusty")
   147  	exp.UpdateMachineSeries("xenial", true).Return(nil)
   148  	exp.RemoveUpgradeSeriesLock().Return(nil)
   149  
   150  	entity := params.Entity{Tag: s.machineTag.String()}
   151  	args := params.UpdateSeriesArgs{
   152  		Args: []params.UpdateSeriesArg{{Entity: entity, Series: "xenial"}},
   153  	}
   154  
   155  	results, err := s.api.FinishUpgradeSeries(args)
   156  	c.Assert(err, jc.ErrorIsNil)
   157  	c.Assert(results, gc.DeepEquals, params.ErrorResults{
   158  		Results: []params.ErrorResult{{}},
   159  	})
   160  }
   161  
   162  func (s *upgradeSeriesSuite) TestFinishUpgradeSeriesNotUpgraded(c *gc.C) {
   163  	defer s.arrangeTest(c).Finish()
   164  
   165  	exp := s.machine.EXPECT()
   166  	exp.Series().Return("trusty")
   167  	exp.RemoveUpgradeSeriesLock().Return(nil)
   168  
   169  	entity := params.Entity{Tag: s.machineTag.String()}
   170  	args := params.UpdateSeriesArgs{
   171  		Args: []params.UpdateSeriesArg{{Entity: entity, Series: "trusty"}},
   172  	}
   173  
   174  	results, err := s.api.FinishUpgradeSeries(args)
   175  	c.Assert(err, jc.ErrorIsNil)
   176  	c.Assert(results, gc.DeepEquals, params.ErrorResults{
   177  		Results: []params.ErrorResult{{}},
   178  	})
   179  }
   180  
   181  func (s *upgradeSeriesSuite) arrangeTest(c *gc.C) *gomock.Controller {
   182  	ctrl := gomock.NewController(c)
   183  
   184  	resources := common.NewResources()
   185  	authorizer := apiservertesting.FakeAuthorizer{Tag: s.machineTag}
   186  
   187  	s.backend = mocks.NewMockUpgradeSeriesBackend(ctrl)
   188  	s.machine = mocks.NewMockUpgradeSeriesMachine(ctrl)
   189  
   190  	s.backend.EXPECT().Machine(s.machineTag.Id()).Return(s.machine, nil)
   191  
   192  	var err error
   193  	s.api, err = upgradeseries.NewUpgradeSeriesAPI(s.backend, resources, authorizer, nil)
   194  	c.Assert(err, jc.ErrorIsNil)
   195  
   196  	return ctrl
   197  }