github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/basesuite_test.go (about) 1 // Copyright 2019 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package apiserver_test 5 6 import ( 7 "time" 8 9 "github.com/juju/clock" 10 "github.com/juju/loggo" 11 "github.com/juju/pubsub/v2" 12 "github.com/juju/testing" 13 jc "github.com/juju/testing/checkers" 14 "github.com/juju/worker/v3/workertest" 15 "github.com/prometheus/client_golang/prometheus" 16 gc "gopkg.in/check.v1" 17 18 "github.com/juju/juju/api" 19 "github.com/juju/juju/apiserver" 20 "github.com/juju/juju/apiserver/testserver" 21 "github.com/juju/juju/core/cache" 22 "github.com/juju/juju/state" 23 statetesting "github.com/juju/juju/state/testing" 24 "github.com/juju/juju/worker/gate" 25 "github.com/juju/juju/worker/modelcache" 26 "github.com/juju/juju/worker/multiwatcher" 27 ) 28 29 type baseSuite struct { 30 statetesting.StateSuite 31 32 controller *cache.Controller 33 34 cfg apiserver.ServerConfig 35 } 36 37 func (s *baseSuite) SetUpTest(c *gc.C) { 38 s.StateSuite.SetUpTest(c) 39 loggo.GetLogger("juju.apiserver").SetLogLevel(loggo.TRACE) 40 41 allWatcherBacking, err := state.NewAllWatcherBacking(s.StatePool) 42 c.Assert(err, jc.ErrorIsNil) 43 multiWatcherWorker, err := multiwatcher.NewWorker(multiwatcher.Config{ 44 Clock: clock.WallClock, 45 Logger: loggo.GetLogger("test"), 46 Backing: allWatcherBacking, 47 PrometheusRegisterer: noopRegisterer{}, 48 }) 49 c.Assert(err, jc.ErrorIsNil) 50 // The worker itself is a coremultiwatcher.Factory. 51 s.AddCleanup(func(c *gc.C) { workertest.CleanKill(c, multiWatcherWorker) }) 52 53 initialized := gate.NewLock() 54 modelCache, err := modelcache.NewWorker(modelcache.Config{ 55 StatePool: s.StatePool, 56 Hub: pubsub.NewStructuredHub(nil), 57 InitializedGate: initialized, 58 Logger: loggo.GetLogger("modelcache"), 59 WatcherFactory: multiWatcherWorker.WatchController, 60 PrometheusRegisterer: noopRegisterer{}, 61 Cleanup: func() {}, 62 }.WithDefaultRestartStrategy()) 63 c.Assert(err, jc.ErrorIsNil) 64 s.AddCleanup(func(c *gc.C) { workertest.CleanKill(c, modelCache) }) 65 66 select { 67 case <-initialized.Unlocked(): 68 case <-time.After(testing.LongWait): 69 c.Fatalf("model cache not initialized after %s", testing.LongWait) 70 } 71 err = modelcache.ExtractCacheController(modelCache, &s.controller) 72 c.Assert(err, jc.ErrorIsNil) 73 74 s.cfg = testserver.DefaultServerConfig(c, s.Clock) 75 s.cfg.Controller = s.controller 76 } 77 78 func (s *baseSuite) newServer(c *gc.C) *testserver.Server { 79 server := testserver.NewServerWithConfig(c, s.StatePool, s.cfg) 80 s.AddCleanup(func(c *gc.C) { 81 workertest.CleanKill(c, server.APIServer) 82 server.HTTPServer.Close() 83 }) 84 server.Info.ModelTag = s.Model.ModelTag() 85 return server 86 } 87 88 func (s *baseSuite) openAPIWithoutLogin(c *gc.C, info0 *api.Info) api.Connection { 89 info := *info0 90 info.Tag = nil 91 info.Password = "" 92 info.SkipLogin = true 93 info.Macaroons = nil 94 st, err := api.Open(&info, fastDialOpts) 95 c.Assert(err, jc.ErrorIsNil) 96 s.AddCleanup(func(*gc.C) { _ = st.Close() }) 97 return st 98 } 99 100 // derivedSuite is just here to test newServer is clean. 101 type derivedSuite struct { 102 baseSuite 103 } 104 105 var _ = gc.Suite(&derivedSuite{}) 106 107 func (s *derivedSuite) TestNewServer(c *gc.C) { 108 _ = s.newServer(c) 109 } 110 111 type noopRegisterer struct { 112 prometheus.Registerer 113 } 114 115 func (noopRegisterer) Register(prometheus.Collector) error { 116 return nil 117 } 118 119 func (noopRegisterer) Unregister(prometheus.Collector) bool { 120 return true 121 }