github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/caasoperatorprovisioner/manifold.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package caasoperatorprovisioner
     5  
     6  import (
     7  	"github.com/juju/clock"
     8  	"github.com/juju/errors"
     9  	"github.com/juju/worker/v3"
    10  	"github.com/juju/worker/v3/dependency"
    11  
    12  	"github.com/juju/juju/agent"
    13  	"github.com/juju/juju/api/base"
    14  	"github.com/juju/juju/api/controller/caasoperatorprovisioner"
    15  	"github.com/juju/juju/caas"
    16  )
    17  
    18  // Logger represents the methods used by the worker to log details.
    19  type Logger interface {
    20  	Debugf(string, ...interface{})
    21  	Infof(string, ...interface{})
    22  	Tracef(string, ...interface{})
    23  }
    24  
    25  // ManifoldConfig defines a CAAS operator provisioner's dependencies.
    26  type ManifoldConfig struct {
    27  	AgentName     string
    28  	APICallerName string
    29  	BrokerName    string
    30  	ClockName     string
    31  	NewWorker     func(Config) (worker.Worker, error)
    32  	Logger        Logger
    33  }
    34  
    35  // Validate is called by start to check for bad configuration.
    36  func (config ManifoldConfig) Validate() error {
    37  	if config.AgentName == "" {
    38  		return errors.NotValidf("empty AgentName")
    39  	}
    40  	if config.APICallerName == "" {
    41  		return errors.NotValidf("empty APICallerName")
    42  	}
    43  	if config.BrokerName == "" {
    44  		return errors.NotValidf("empty BrokerName")
    45  	}
    46  	if config.ClockName == "" {
    47  		return errors.NotValidf("empty ClockName")
    48  	}
    49  	if config.NewWorker == nil {
    50  		return errors.NotValidf("nil NewWorker")
    51  	}
    52  	if config.Logger == nil {
    53  		return errors.NotValidf("nil Logger")
    54  	}
    55  	return nil
    56  }
    57  
    58  func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) {
    59  	if err := config.Validate(); err != nil {
    60  		return nil, errors.Trace(err)
    61  	}
    62  
    63  	var agent agent.Agent
    64  	if err := context.Get(config.AgentName, &agent); err != nil {
    65  		return nil, errors.Trace(err)
    66  	}
    67  
    68  	var apiCaller base.APICaller
    69  	if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    70  		return nil, errors.Trace(err)
    71  	}
    72  
    73  	var clock clock.Clock
    74  	if err := context.Get(config.ClockName, &clock); err != nil {
    75  		return nil, errors.Trace(err)
    76  	}
    77  
    78  	var broker caas.Broker
    79  	if err := context.Get(config.BrokerName, &broker); err != nil {
    80  		return nil, errors.Trace(err)
    81  	}
    82  
    83  	modelTag, ok := apiCaller.ModelTag()
    84  	if !ok {
    85  		return nil, errors.New("API connection is controller-only (should never happen)")
    86  	}
    87  
    88  	api := caasoperatorprovisioner.NewClient(apiCaller)
    89  	agentConfig := agent.CurrentConfig()
    90  	w, err := config.NewWorker(Config{
    91  		Facade:          api,
    92  		OperatorManager: broker,
    93  		ModelTag:        modelTag,
    94  		AgentConfig:     agentConfig,
    95  		Clock:           clock,
    96  		Logger:          config.Logger,
    97  	})
    98  	if err != nil {
    99  		return nil, errors.Trace(err)
   100  	}
   101  	return w, nil
   102  }
   103  
   104  // Manifold creates a manifold that runs a CAAS operator provisioner. See the
   105  // ManifoldConfig type for discussion about how this can/should evolve.
   106  func Manifold(config ManifoldConfig) dependency.Manifold {
   107  	return dependency.Manifold{
   108  		Inputs: []string{
   109  			config.AgentName,
   110  			config.APICallerName,
   111  			config.BrokerName,
   112  			config.ClockName,
   113  		},
   114  		Start: config.start,
   115  	}
   116  }