github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/machineactions/manifold_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Copyright 2016 Cloudbase Solutions 3 // Licensed under the AGPLv3, see LICENCE file for details. 4 5 package machineactions_test 6 7 import ( 8 "github.com/juju/errors" 9 "github.com/juju/names/v5" 10 "github.com/juju/testing" 11 jc "github.com/juju/testing/checkers" 12 "github.com/juju/worker/v3" 13 "github.com/juju/worker/v3/dependency" 14 dt "github.com/juju/worker/v3/dependency/testing" 15 gc "gopkg.in/check.v1" 16 17 "github.com/juju/juju/agent" 18 "github.com/juju/juju/api/base" 19 "github.com/juju/juju/core/machinelock" 20 "github.com/juju/juju/worker/machineactions" 21 ) 22 23 type ManifoldSuite struct { 24 testing.IsolationSuite 25 context dependency.Context 26 fakeAgent agent.Agent 27 fakeCaller base.APICaller 28 fakeFacade machineactions.Facade 29 fakeWorker worker.Worker 30 fakeLock machinelock.Lock 31 newFacade func(machineactions.Facade) func(base.APICaller) machineactions.Facade 32 newWorker func(worker.Worker, error) func(machineactions.WorkerConfig) (worker.Worker, error) 33 } 34 35 var _ = gc.Suite(&ManifoldSuite{}) 36 37 func (s *ManifoldSuite) SetUpSuite(c *gc.C) { 38 s.IsolationSuite.SetUpSuite(c) 39 s.fakeAgent = &fakeAgent{tag: fakeTag} 40 s.fakeCaller = &fakeCaller{} 41 s.fakeLock = machinelock.Lock(nil) 42 43 s.context = dt.StubContext(nil, map[string]interface{}{ 44 "wut": s.fakeAgent, 45 "exactly": s.fakeCaller, 46 }) 47 48 s.newFacade = func(facade machineactions.Facade) func(base.APICaller) machineactions.Facade { 49 s.fakeFacade = facade 50 return func(apiCaller base.APICaller) machineactions.Facade { 51 c.Assert(apiCaller, gc.Equals, s.fakeCaller) 52 return facade 53 } 54 } 55 s.newWorker = func(w worker.Worker, err error) func(machineactions.WorkerConfig) (worker.Worker, error) { 56 s.fakeWorker = w 57 return func(wc machineactions.WorkerConfig) (worker.Worker, error) { 58 c.Assert(wc.Facade, gc.Equals, s.fakeFacade) 59 c.Assert(wc.MachineTag, gc.Equals, fakeTag) 60 c.Assert(wc.HandleAction, gc.Equals, fakeHandleAction) 61 c.Assert(wc.MachineLock, gc.Equals, s.fakeLock) 62 return w, err 63 } 64 } 65 } 66 67 func (s *ManifoldSuite) TestInputs(c *gc.C) { 68 manifold := machineactions.Manifold(machineactions.ManifoldConfig{ 69 AgentName: "wut", 70 APICallerName: "exactly", 71 }) 72 c.Check(manifold.Inputs, jc.DeepEquals, []string{"wut", "exactly"}) 73 } 74 75 func (s *ManifoldSuite) TestStartMissingAgent(c *gc.C) { 76 manifold := machineactions.Manifold(machineactions.ManifoldConfig{ 77 AgentName: "wut", 78 APICallerName: "exactly", 79 }) 80 context := dt.StubContext(nil, map[string]interface{}{ 81 "wut": dependency.ErrMissing, 82 }) 83 84 w, err := manifold.Start(context) 85 c.Assert(errors.Cause(err), gc.Equals, dependency.ErrMissing) 86 c.Assert(w, gc.IsNil) 87 } 88 89 func (s *ManifoldSuite) TestStartMissingAPI(c *gc.C) { 90 manifold := machineactions.Manifold(machineactions.ManifoldConfig{ 91 AgentName: "wut", 92 APICallerName: "exactly", 93 }) 94 context := dt.StubContext(nil, map[string]interface{}{ 95 "wut": &fakeAgent{}, 96 "exactly": dependency.ErrMissing, 97 }) 98 99 w, err := manifold.Start(context) 100 c.Assert(errors.Cause(err), gc.Equals, dependency.ErrMissing) 101 c.Assert(w, gc.IsNil) 102 } 103 104 func (s *ManifoldSuite) TestStartWorkerError(c *gc.C) { 105 manifold := machineactions.Manifold(machineactions.ManifoldConfig{ 106 AgentName: "wut", 107 APICallerName: "exactly", 108 NewFacade: s.newFacade(&fakeFacade{}), 109 NewWorker: s.newWorker(nil, errors.New("blam")), 110 MachineLock: s.fakeLock, 111 }) 112 113 w, err := manifold.Start(s.context) 114 c.Assert(err, gc.ErrorMatches, "blam") 115 c.Assert(w, gc.IsNil) 116 } 117 118 func (s *ManifoldSuite) TestStartSuccess(c *gc.C) { 119 fakeWorker := &fakeWorker{} 120 manifold := machineactions.Manifold(machineactions.ManifoldConfig{ 121 AgentName: "wut", 122 APICallerName: "exactly", 123 NewFacade: s.newFacade(&fakeFacade{}), 124 NewWorker: s.newWorker(fakeWorker, nil), 125 MachineLock: s.fakeLock, 126 }) 127 128 w, err := manifold.Start(s.context) 129 c.Assert(err, jc.ErrorIsNil) 130 c.Assert(w, gc.Equals, fakeWorker) 131 } 132 133 func (s *ManifoldSuite) TestInvalidTag(c *gc.C) { 134 fakeWorker := &fakeWorker{} 135 manifold := machineactions.Manifold(machineactions.ManifoldConfig{ 136 AgentName: "wut", 137 APICallerName: "exactly", 138 NewFacade: s.newFacade(&fakeFacade{}), 139 NewWorker: s.newWorker(fakeWorker, nil), 140 MachineLock: s.fakeLock, 141 }) 142 context := dt.StubContext(nil, map[string]interface{}{ 143 "wut": &fakeAgent{tag: fakeTagErr}, 144 "exactly": s.fakeCaller, 145 }) 146 147 w, err := manifold.Start(context) 148 c.Assert(err, gc.ErrorMatches, "this manifold can only be used inside a machine") 149 c.Assert(w, gc.IsNil) 150 } 151 152 var fakeTag = names.NewMachineTag("4") 153 var fakeTagErr = names.NewUnitTag("whatatag/0") 154 155 type fakeAgent struct { 156 agent.Agent 157 tag names.Tag 158 } 159 160 func (mock *fakeAgent) CurrentConfig() agent.Config { 161 return &fakeConfig{tag: mock.tag} 162 } 163 164 type fakeConfig struct { 165 agent.Config 166 tag names.Tag 167 } 168 169 func (mock *fakeConfig) Tag() names.Tag { 170 return mock.tag 171 } 172 173 type fakeCaller struct { 174 base.APICaller 175 } 176 177 type fakeFacade struct { 178 machineactions.Facade 179 } 180 181 type fakeWorker struct { 182 worker.Worker 183 } 184 185 var fakeHandleAction = func(name string, params map[string]interface{}) (results map[string]interface{}, err error) { 186 return nil, nil 187 }