github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/api/agent/caasapplication/client_test.go (about) 1 // Copyright 2020 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caasapplication_test 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/names/v5" 9 "github.com/juju/testing" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/api/agent/caasapplication" 14 basetesting "github.com/juju/juju/api/base/testing" 15 "github.com/juju/juju/rpc/params" 16 ) 17 18 type provisionerSuite struct { 19 testing.IsolationSuite 20 } 21 22 var _ = gc.Suite(&provisionerSuite{}) 23 24 func newClient(f basetesting.APICallerFunc) *caasapplication.Client { 25 return caasapplication.NewClient(basetesting.BestVersionCaller{f, 1}) 26 } 27 28 func (s *provisionerSuite) TestUnitIntroduction(c *gc.C) { 29 var called bool 30 client := newClient(func(objType string, version int, id, request string, a, result interface{}) error { 31 called = true 32 c.Assert(objType, gc.Equals, "CAASApplication") 33 c.Assert(id, gc.Equals, "") 34 c.Assert(request, gc.Equals, "UnitIntroduction") 35 c.Assert(a, gc.FitsTypeOf, params.CAASUnitIntroductionArgs{}) 36 args := a.(params.CAASUnitIntroductionArgs) 37 c.Assert(args.PodName, gc.Equals, "pod-name") 38 c.Assert(args.PodUUID, gc.Equals, "pod-uuid") 39 c.Assert(result, gc.FitsTypeOf, ¶ms.CAASUnitIntroductionResult{}) 40 *(result.(*params.CAASUnitIntroductionResult)) = params.CAASUnitIntroductionResult{ 41 Result: ¶ms.CAASUnitIntroduction{ 42 AgentConf: []byte("config data"), 43 UnitName: "app/0", 44 }, 45 } 46 return nil 47 }) 48 unitConfig, err := client.UnitIntroduction("pod-name", "pod-uuid") 49 c.Assert(err, jc.ErrorIsNil) 50 c.Assert(called, jc.IsTrue) 51 c.Assert(unitConfig, gc.NotNil) 52 c.Assert(unitConfig.UnitTag.String(), gc.Equals, "unit-app-0") 53 c.Assert(unitConfig.AgentConf, jc.SameContents, []byte("config data")) 54 } 55 56 func (s *provisionerSuite) TestUnitIntroductionFail(c *gc.C) { 57 var called bool 58 client := newClient(func(objType string, version int, id, request string, a, result interface{}) error { 59 called = true 60 c.Assert(objType, gc.Equals, "CAASApplication") 61 c.Assert(id, gc.Equals, "") 62 c.Assert(request, gc.Equals, "UnitIntroduction") 63 c.Assert(a, gc.FitsTypeOf, params.CAASUnitIntroductionArgs{}) 64 args := a.(params.CAASUnitIntroductionArgs) 65 c.Assert(args.PodName, gc.Equals, "pod-name") 66 c.Assert(args.PodUUID, gc.Equals, "pod-uuid") 67 c.Assert(result, gc.FitsTypeOf, ¶ms.CAASUnitIntroductionResult{}) 68 *(result.(*params.CAASUnitIntroductionResult)) = params.CAASUnitIntroductionResult{ 69 Error: ¶ms.Error{Message: "FAIL"}, 70 } 71 return nil 72 }) 73 _, err := client.UnitIntroduction("pod-name", "pod-uuid") 74 c.Assert(err, gc.ErrorMatches, "FAIL") 75 c.Assert(called, jc.IsTrue) 76 } 77 78 func (s *provisionerSuite) TestUnitIntroductionFailAlreadyExists(c *gc.C) { 79 var called bool 80 client := newClient(func(objType string, version int, id, request string, a, result interface{}) error { 81 called = true 82 c.Assert(objType, gc.Equals, "CAASApplication") 83 c.Assert(id, gc.Equals, "") 84 c.Assert(request, gc.Equals, "UnitIntroduction") 85 c.Assert(a, gc.FitsTypeOf, params.CAASUnitIntroductionArgs{}) 86 args := a.(params.CAASUnitIntroductionArgs) 87 c.Assert(args.PodName, gc.Equals, "pod-name") 88 c.Assert(args.PodUUID, gc.Equals, "pod-uuid") 89 c.Assert(result, gc.FitsTypeOf, ¶ms.CAASUnitIntroductionResult{}) 90 *(result.(*params.CAASUnitIntroductionResult)) = params.CAASUnitIntroductionResult{ 91 Error: ¶ms.Error{Code: params.CodeAlreadyExists}, 92 } 93 return nil 94 }) 95 _, err := client.UnitIntroduction("pod-name", "pod-uuid") 96 c.Assert(errors.Is(err, errors.AlreadyExists), jc.IsTrue) 97 c.Assert(called, jc.IsTrue) 98 } 99 100 func (s *provisionerSuite) TestUnitIntroductionFailNotAssigned(c *gc.C) { 101 var called bool 102 client := newClient(func(objType string, version int, id, request string, a, result interface{}) error { 103 called = true 104 c.Assert(objType, gc.Equals, "CAASApplication") 105 c.Assert(id, gc.Equals, "") 106 c.Assert(request, gc.Equals, "UnitIntroduction") 107 c.Assert(a, gc.FitsTypeOf, params.CAASUnitIntroductionArgs{}) 108 args := a.(params.CAASUnitIntroductionArgs) 109 c.Assert(args.PodName, gc.Equals, "pod-name") 110 c.Assert(args.PodUUID, gc.Equals, "pod-uuid") 111 c.Assert(result, gc.FitsTypeOf, ¶ms.CAASUnitIntroductionResult{}) 112 *(result.(*params.CAASUnitIntroductionResult)) = params.CAASUnitIntroductionResult{ 113 Error: ¶ms.Error{Code: params.CodeNotAssigned}, 114 } 115 return nil 116 }) 117 _, err := client.UnitIntroduction("pod-name", "pod-uuid") 118 c.Assert(errors.Is(err, errors.NotAssigned), jc.IsTrue) 119 c.Assert(called, jc.IsTrue) 120 } 121 122 func (s *provisionerSuite) TestUnitTerminating(c *gc.C) { 123 tests := []struct { 124 willRestart bool 125 err error 126 }{ 127 {false, nil}, 128 {true, nil}, 129 {false, errors.New("oops")}, 130 } 131 for _, test := range tests { 132 var called bool 133 client := newClient(func(objType string, version int, id, request string, a, result interface{}) error { 134 called = true 135 c.Assert(objType, gc.Equals, "CAASApplication") 136 c.Assert(id, gc.Equals, "") 137 c.Assert(request, gc.Equals, "UnitTerminating") 138 c.Assert(a, gc.FitsTypeOf, params.Entity{}) 139 args := a.(params.Entity) 140 c.Assert(args.Tag, gc.Equals, "unit-app-0") 141 c.Assert(result, gc.FitsTypeOf, ¶ms.CAASUnitTerminationResult{}) 142 var err *params.Error 143 if test.err != nil { 144 err = ¶ms.Error{Message: test.err.Error()} 145 } 146 *(result.(*params.CAASUnitTerminationResult)) = params.CAASUnitTerminationResult{ 147 WillRestart: test.willRestart, 148 Error: err, 149 } 150 return nil 151 }) 152 unitTermination, err := client.UnitTerminating(names.NewUnitTag("app/0")) 153 if test.err == nil { 154 c.Assert(err, jc.ErrorIsNil) 155 } else { 156 c.Assert(err, gc.ErrorMatches, test.err.Error()) 157 } 158 c.Assert(called, jc.IsTrue) 159 c.Assert(unitTermination, gc.DeepEquals, caasapplication.UnitTermination{WillRestart: test.willRestart}) 160 } 161 }