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  }