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  }