github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/storageprovisioner/manifold_machine_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package storageprovisioner_test 5 6 import ( 7 "time" 8 9 "github.com/juju/clock/testclock" 10 "github.com/juju/errors" 11 "github.com/juju/loggo" 12 "github.com/juju/names/v5" 13 "github.com/juju/testing" 14 jc "github.com/juju/testing/checkers" 15 "github.com/juju/worker/v3" 16 gc "gopkg.in/check.v1" 17 18 "github.com/juju/juju/agent" 19 "github.com/juju/juju/api" 20 "github.com/juju/juju/cmd/jujud/agent/engine/enginetest" 21 "github.com/juju/juju/core/model" 22 "github.com/juju/juju/rpc/params" 23 "github.com/juju/juju/worker/common" 24 "github.com/juju/juju/worker/storageprovisioner" 25 ) 26 27 type MachineManifoldSuite struct { 28 testing.IsolationSuite 29 config storageprovisioner.MachineManifoldConfig 30 newCalled bool 31 } 32 33 var ( 34 defaultClockStart time.Time 35 _ = gc.Suite(&MachineManifoldSuite{}) 36 ) 37 38 func (s *MachineManifoldSuite) SetUpTest(c *gc.C) { 39 s.newCalled = false 40 s.PatchValue(&storageprovisioner.NewStorageProvisioner, 41 func(config storageprovisioner.Config) (worker.Worker, error) { 42 s.newCalled = true 43 return nil, nil 44 }, 45 ) 46 config := enginetest.AgentAPIManifoldTestConfig() 47 s.config = storageprovisioner.MachineManifoldConfig{ 48 AgentName: config.AgentName, 49 APICallerName: config.APICallerName, 50 Clock: testclock.NewClock(defaultClockStart), 51 Logger: loggo.GetLogger("test"), 52 NewCredentialValidatorFacade: common.NewCredentialInvalidatorFacade, 53 } 54 } 55 56 func (s *MachineManifoldSuite) TestMachine(c *gc.C) { 57 _, err := enginetest.RunAgentAPIManifold( 58 storageprovisioner.MachineManifold(s.config), 59 &fakeAgent{tag: names.NewMachineTag("42")}, 60 &fakeAPIConn{}) 61 c.Assert(err, jc.ErrorIsNil) 62 c.Assert(s.newCalled, jc.IsTrue) 63 } 64 65 func (s *MachineManifoldSuite) TestMissingClock(c *gc.C) { 66 s.config.Clock = nil 67 _, err := enginetest.RunAgentAPIManifold( 68 storageprovisioner.MachineManifold(s.config), 69 &fakeAgent{tag: names.NewMachineTag("42")}, 70 &fakeAPIConn{}) 71 c.Assert(err, jc.Satisfies, errors.IsNotValid) 72 c.Assert(err.Error(), gc.Equals, "missing Clock not valid") 73 c.Assert(s.newCalled, jc.IsFalse) 74 } 75 76 func (s *MachineManifoldSuite) TestMissingLogger(c *gc.C) { 77 s.config.Logger = nil 78 _, err := enginetest.RunAgentAPIManifold( 79 storageprovisioner.MachineManifold(s.config), 80 &fakeAgent{tag: names.NewMachineTag("42")}, 81 &fakeAPIConn{}) 82 c.Assert(err, jc.Satisfies, errors.IsNotValid) 83 c.Assert(err.Error(), gc.Equals, "missing Logger not valid") 84 c.Assert(s.newCalled, jc.IsFalse) 85 } 86 87 func (s *MachineManifoldSuite) TestNonAgent(c *gc.C) { 88 _, err := enginetest.RunAgentAPIManifold( 89 storageprovisioner.MachineManifold(s.config), 90 &fakeAgent{tag: names.NewUserTag("foo")}, 91 &fakeAPIConn{}) 92 c.Assert(err, gc.ErrorMatches, "this manifold may only be used inside a machine agent") 93 c.Assert(s.newCalled, jc.IsFalse) 94 } 95 96 type fakeAgent struct { 97 agent.Agent 98 tag names.Tag 99 } 100 101 func (a *fakeAgent) CurrentConfig() agent.Config { 102 return &fakeConfig{tag: a.tag} 103 } 104 105 type fakeConfig struct { 106 agent.Config 107 tag names.Tag 108 } 109 110 func (c *fakeConfig) Tag() names.Tag { 111 return c.tag 112 } 113 114 func (_ fakeConfig) DataDir() string { 115 return "/path/to/data/dir" 116 } 117 118 type fakeAPIConn struct { 119 api.Connection 120 machineJob model.MachineJob 121 } 122 123 func (f *fakeAPIConn) APICall(objType string, version int, id, request string, args interface{}, response interface{}) error { 124 if res, ok := response.(*params.AgentGetEntitiesResults); ok { 125 res.Entities = []params.AgentGetEntitiesResult{ 126 {Jobs: []model.MachineJob{f.machineJob}}, 127 } 128 } 129 130 return nil 131 } 132 133 func (*fakeAPIConn) BestFacadeVersion(facade string) int { 134 return 42 135 }