github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/apiserver/worker.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package apiserver 5 6 import ( 7 "net/http" 8 9 "github.com/juju/clock" 10 "github.com/juju/errors" 11 "github.com/juju/loggo" 12 "github.com/juju/pubsub" 13 "gopkg.in/juju/worker.v1" 14 15 "github.com/juju/juju/agent" 16 "github.com/juju/juju/apiserver" 17 "github.com/juju/juju/apiserver/apiserverhttp" 18 "github.com/juju/juju/apiserver/httpcontext" 19 "github.com/juju/juju/core/auditlog" 20 "github.com/juju/juju/core/cache" 21 "github.com/juju/juju/core/lease" 22 "github.com/juju/juju/core/presence" 23 "github.com/juju/juju/state" 24 ) 25 26 var logger = loggo.GetLogger("juju.worker.apiserver") 27 28 // Config is the configuration required for running an API server worker. 29 type Config struct { 30 AgentConfig agent.Config 31 Clock clock.Clock 32 Hub *pubsub.StructuredHub 33 Presence presence.Recorder 34 Mux *apiserverhttp.Mux 35 Authenticator httpcontext.LocalMacaroonAuthenticator 36 StatePool *state.StatePool 37 Controller *cache.Controller 38 LeaseManager lease.Manager 39 RegisterIntrospectionHTTPHandlers func(func(path string, _ http.Handler)) 40 RestoreStatus func() state.RestoreStatus 41 UpgradeComplete func() bool 42 GetAuditConfig func() auditlog.Config 43 NewServer NewServerFunc 44 MetricsCollector *apiserver.Collector 45 } 46 47 // NewServerFunc is the type of function that will be used 48 // by the worker to create a new API server. 49 type NewServerFunc func(apiserver.ServerConfig) (worker.Worker, error) 50 51 // Validate validates the API server configuration. 52 func (config Config) Validate() error { 53 if config.AgentConfig == nil { 54 return errors.NotValidf("nil AgentConfig") 55 } 56 if config.Clock == nil { 57 return errors.NotValidf("nil Clock") 58 } 59 if config.Hub == nil { 60 return errors.NotValidf("nil Hub") 61 } 62 if config.Presence == nil { 63 return errors.NotValidf("nil Presence") 64 } 65 if config.StatePool == nil { 66 return errors.NotValidf("nil StatePool") 67 } 68 if config.Controller == nil { 69 return errors.NotValidf("nil Controller") 70 } 71 if config.Mux == nil { 72 return errors.NotValidf("nil Mux") 73 } 74 if config.Authenticator == nil { 75 return errors.NotValidf("nil Authenticator") 76 } 77 if config.LeaseManager == nil { 78 return errors.NotValidf("nil LeaseManager") 79 } 80 if config.RegisterIntrospectionHTTPHandlers == nil { 81 return errors.NotValidf("nil RegisterIntrospectionHTTPHandlers") 82 } 83 if config.RestoreStatus == nil { 84 return errors.NotValidf("nil RestoreStatus") 85 } 86 if config.UpgradeComplete == nil { 87 return errors.NotValidf("nil UpgradeComplete") 88 } 89 if config.NewServer == nil { 90 return errors.NotValidf("nil NewServer") 91 } 92 if config.MetricsCollector == nil { 93 return errors.NotValidf("nil MetricsCollector") 94 } 95 return nil 96 } 97 98 // NewWorker returns a new API server worker, with the given configuration. 99 func NewWorker(config Config) (worker.Worker, error) { 100 if err := config.Validate(); err != nil { 101 return nil, errors.Trace(err) 102 } 103 104 rateLimitConfig, err := getRateLimitConfig(config.AgentConfig) 105 if err != nil { 106 return nil, errors.Annotate(err, "getting rate limit config") 107 } 108 109 logSinkConfig, err := getLogSinkConfig(config.AgentConfig) 110 if err != nil { 111 return nil, errors.Annotate(err, "getting log sink config") 112 } 113 114 controllerConfig, err := config.StatePool.SystemState().ControllerConfig() 115 if err != nil { 116 return nil, errors.Annotate(err, "cannot fetch the controller config") 117 } 118 119 observerFactory, err := newObserverFn( 120 config.AgentConfig, 121 controllerConfig, 122 config.Clock, 123 config.Hub, 124 config.MetricsCollector, 125 ) 126 if err != nil { 127 return nil, errors.Annotate(err, "cannot create RPC observer factory") 128 } 129 130 serverConfig := apiserver.ServerConfig{ 131 StatePool: config.StatePool, 132 Controller: config.Controller, 133 Clock: config.Clock, 134 Tag: config.AgentConfig.Tag(), 135 DataDir: config.AgentConfig.DataDir(), 136 LogDir: config.AgentConfig.LogDir(), 137 Hub: config.Hub, 138 Presence: config.Presence, 139 Mux: config.Mux, 140 Authenticator: config.Authenticator, 141 RestoreStatus: config.RestoreStatus, 142 UpgradeComplete: config.UpgradeComplete, 143 PublicDNSName: controllerConfig.AutocertDNSName(), 144 AllowModelAccess: controllerConfig.AllowModelAccess(), 145 NewObserver: observerFactory, 146 RegisterIntrospectionHandlers: config.RegisterIntrospectionHTTPHandlers, 147 MetricsCollector: config.MetricsCollector, 148 RateLimitConfig: rateLimitConfig, 149 LogSinkConfig: &logSinkConfig, 150 GetAuditConfig: config.GetAuditConfig, 151 LeaseManager: config.LeaseManager, 152 } 153 return config.NewServer(serverConfig) 154 } 155 156 func newServerShim(config apiserver.ServerConfig) (worker.Worker, error) { 157 return apiserver.NewServer(config) 158 } 159 160 // NewMetricsCollector returns a new apiserver collector 161 func NewMetricsCollector() *apiserver.Collector { 162 return apiserver.NewMetricsCollector() 163 }