github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facades/agent/logger/logger_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package logger_test 5 6 import ( 7 "github.com/juju/names/v5" 8 jc "github.com/juju/testing/checkers" 9 "github.com/juju/worker/v3/workertest" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/apiserver/common" 13 "github.com/juju/juju/apiserver/facade" 14 "github.com/juju/juju/apiserver/facade/facadetest" 15 "github.com/juju/juju/apiserver/facades/agent/logger" 16 apiservertesting "github.com/juju/juju/apiserver/testing" 17 "github.com/juju/juju/core/cache" 18 "github.com/juju/juju/core/cache/cachetest" 19 "github.com/juju/juju/rpc/params" 20 "github.com/juju/juju/state" 21 statetesting "github.com/juju/juju/state/testing" 22 ) 23 24 type loggerSuite struct { 25 statetesting.StateSuite 26 27 // These are raw State objects. Use them for setup and assertions, but 28 // should never be touched by the API calls themselves 29 rawMachine *state.Machine 30 logger *logger.LoggerAPI 31 resources *common.Resources 32 authorizer apiservertesting.FakeAuthorizer 33 34 ctrl *cachetest.TestController 35 } 36 37 var _ = gc.Suite(&loggerSuite{}) 38 39 func (s *loggerSuite) SetUpTest(c *gc.C) { 40 s.StateSuite.SetUpTest(c) 41 s.resources = common.NewResources() 42 s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() }) 43 44 // Create a machine to work with 45 var err error 46 s.rawMachine, err = s.State.AddMachine(state.UbuntuBase("12.10"), state.JobHostUnits) 47 c.Assert(err, jc.ErrorIsNil) 48 49 // The default auth is as the machine agent 50 s.authorizer = apiservertesting.FakeAuthorizer{ 51 Tag: s.rawMachine.Tag(), 52 } 53 54 s.ctrl = cachetest.NewTestController(cachetest.ModelEvents) 55 s.ctrl.Init(c) 56 s.AddCleanup(func(c *gc.C) { workertest.CleanKill(c, s.ctrl.Controller) }) 57 58 // Add the current model to the controller. 59 m := cachetest.ModelChangeFromState(c, s.State) 60 s.ctrl.SendChange(m) 61 62 // Ensure it is processed before we create the logger API. 63 _ = s.ctrl.NextChange(c) 64 65 s.logger, err = s.makeLoggerAPI(s.authorizer) 66 c.Assert(err, jc.ErrorIsNil) 67 } 68 69 func (s *loggerSuite) makeLoggerAPI(auth facade.Authorizer) (*logger.LoggerAPI, error) { 70 ctx := facadetest.Context{ 71 Auth_: auth, 72 Controller_: s.ctrl.Controller, 73 Resources_: s.resources, 74 State_: s.State, 75 } 76 return logger.NewLoggerAPI(ctx) 77 } 78 79 func (s *loggerSuite) TestNewLoggerAPIRefusesNonAgent(c *gc.C) { 80 // We aren't even a machine agent 81 anAuthorizer := s.authorizer 82 anAuthorizer.Tag = names.NewUserTag("some-user") 83 endPoint, err := s.makeLoggerAPI(anAuthorizer) 84 c.Assert(endPoint, gc.IsNil) 85 c.Assert(err, gc.ErrorMatches, "permission denied") 86 } 87 88 func (s *loggerSuite) TestNewLoggerAPIAcceptsUnitAgent(c *gc.C) { 89 // We aren't even a machine agent 90 anAuthorizer := s.authorizer 91 anAuthorizer.Tag = names.NewUnitTag("germany/7") 92 endPoint, err := s.makeLoggerAPI(anAuthorizer) 93 c.Assert(err, jc.ErrorIsNil) 94 c.Assert(endPoint, gc.NotNil) 95 } 96 97 func (s *loggerSuite) TestNewLoggerAPIAcceptsApplicationAgent(c *gc.C) { 98 anAuthorizer := s.authorizer 99 anAuthorizer.Tag = names.NewApplicationTag("germany") 100 endPoint, err := s.makeLoggerAPI(anAuthorizer) 101 c.Assert(err, jc.ErrorIsNil) 102 c.Assert(endPoint, gc.NotNil) 103 } 104 105 func (s *loggerSuite) TestWatchLoggingConfigNothing(c *gc.C) { 106 // Not an error to watch nothing 107 results := s.logger.WatchLoggingConfig(params.Entities{}) 108 c.Assert(results.Results, gc.HasLen, 0) 109 } 110 111 func (s *loggerSuite) setLoggingConfig(c *gc.C, loggingConfig string) { 112 m := cachetest.ModelChangeFromState(c, s.State) 113 m.Config["logging-config"] = loggingConfig 114 s.ctrl.SendChange(m) 115 _ = s.ctrl.NextChange(c) 116 } 117 118 func (s *loggerSuite) TestWatchLoggingConfig(c *gc.C) { 119 args := params.Entities{ 120 Entities: []params.Entity{{Tag: s.rawMachine.Tag().String()}}, 121 } 122 results := s.logger.WatchLoggingConfig(args) 123 c.Assert(results.Results, gc.HasLen, 1) 124 c.Assert(results.Results[0].NotifyWatcherId, gc.Not(gc.Equals), "") 125 c.Assert(results.Results[0].Error, gc.IsNil) 126 resource := s.resources.Get(results.Results[0].NotifyWatcherId) 127 c.Assert(resource, gc.NotNil) 128 129 _, ok := resource.(cache.NotifyWatcher) 130 c.Assert(ok, jc.IsTrue) 131 // The watcher implementation is tested in the cache package. 132 } 133 134 func (s *loggerSuite) TestWatchLoggingConfigRefusesWrongAgent(c *gc.C) { 135 // We are a machine agent, but not the one we are trying to track 136 args := params.Entities{ 137 Entities: []params.Entity{{Tag: "machine-12354"}}, 138 } 139 results := s.logger.WatchLoggingConfig(args) 140 // It is not an error to make the request, but the specific item is rejected 141 c.Assert(results.Results, gc.HasLen, 1) 142 c.Assert(results.Results[0].NotifyWatcherId, gc.Equals, "") 143 c.Assert(results.Results[0].Error, gc.DeepEquals, apiservertesting.ErrUnauthorized) 144 } 145 146 func (s *loggerSuite) TestLoggingConfigForNoone(c *gc.C) { 147 // Not an error to request nothing, dumb, but not an error. 148 results := s.logger.LoggingConfig(params.Entities{}) 149 c.Assert(results.Results, gc.HasLen, 0) 150 } 151 152 func (s *loggerSuite) TestLoggingConfigRefusesWrongAgent(c *gc.C) { 153 args := params.Entities{ 154 Entities: []params.Entity{{Tag: "machine-12354"}}, 155 } 156 results := s.logger.LoggingConfig(args) 157 c.Assert(results.Results, gc.HasLen, 1) 158 result := results.Results[0] 159 c.Assert(result.Error, gc.DeepEquals, apiservertesting.ErrUnauthorized) 160 } 161 162 func (s *loggerSuite) TestLoggingConfigForAgent(c *gc.C) { 163 newLoggingConfig := "<root>=WARN;juju.log.test=DEBUG;unit=INFO" 164 s.setLoggingConfig(c, newLoggingConfig) 165 166 args := params.Entities{ 167 Entities: []params.Entity{{Tag: s.rawMachine.Tag().String()}}, 168 } 169 results := s.logger.LoggingConfig(args) 170 c.Assert(results.Results, gc.HasLen, 1) 171 result := results.Results[0] 172 c.Assert(result.Error, gc.IsNil) 173 c.Assert(result.Result, gc.Equals, newLoggingConfig) 174 }