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

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package caasunitprovisioner
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/worker/v3"
     9  	"github.com/juju/worker/v3/dependency"
    10  
    11  	"github.com/juju/juju/api/base"
    12  	"github.com/juju/juju/caas"
    13  )
    14  
    15  // Logger represents the methods used by the worker to log details.
    16  type Logger interface {
    17  	Debugf(string, ...interface{})
    18  	Warningf(string, ...interface{})
    19  	Errorf(string, ...interface{})
    20  	Tracef(string, ...interface{})
    21  }
    22  
    23  // ManifoldConfig defines a CAAS unit provisioner's dependencies.
    24  type ManifoldConfig struct {
    25  	APICallerName string
    26  	BrokerName    string
    27  
    28  	NewClient func(base.APICaller) Client
    29  	NewWorker func(Config) (worker.Worker, error)
    30  	Logger    Logger
    31  }
    32  
    33  // Validate is called by start to check for bad configuration.
    34  func (config ManifoldConfig) Validate() error {
    35  	if config.APICallerName == "" {
    36  		return errors.NotValidf("empty APICallerName")
    37  	}
    38  	if config.BrokerName == "" {
    39  		return errors.NotValidf("empty BrokerName")
    40  	}
    41  	if config.NewClient == nil {
    42  		return errors.NotValidf("nil NewClient")
    43  	}
    44  	if config.NewWorker == nil {
    45  		return errors.NotValidf("nil NewWorker")
    46  	}
    47  	if config.Logger == nil {
    48  		return errors.NotValidf("nil Logger")
    49  	}
    50  	return nil
    51  }
    52  
    53  func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) {
    54  	if err := config.Validate(); err != nil {
    55  		return nil, errors.Trace(err)
    56  	}
    57  
    58  	var apiCaller base.APICaller
    59  	if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    60  		return nil, errors.Trace(err)
    61  	}
    62  
    63  	var broker caas.Broker
    64  	if err := context.Get(config.BrokerName, &broker); err != nil {
    65  		return nil, errors.Trace(err)
    66  	}
    67  
    68  	client := config.NewClient(apiCaller)
    69  	w, err := config.NewWorker(Config{
    70  		ApplicationGetter:  client,
    71  		ApplicationUpdater: client,
    72  
    73  		ServiceBroker:   broker,
    74  		ContainerBroker: broker,
    75  
    76  		ProvisioningInfoGetter:   client,
    77  		ProvisioningStatusSetter: client,
    78  		LifeGetter:               client,
    79  		UnitUpdater:              client,
    80  		CharmGetter:              client,
    81  
    82  		Logger: config.Logger,
    83  	})
    84  	if err != nil {
    85  		return nil, errors.Trace(err)
    86  	}
    87  	return w, nil
    88  }
    89  
    90  // Manifold creates a manifold that runs a CAAS unit provisioner. See the
    91  // ManifoldConfig type for discussion about how this can/should evolve.
    92  func Manifold(config ManifoldConfig) dependency.Manifold {
    93  	return dependency.Manifold{
    94  		Inputs: []string{
    95  			config.APICallerName,
    96  			config.BrokerName,
    97  		},
    98  		Start: config.start,
    99  	}
   100  }