github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/caasmodelconfigmanager/manifold.go (about)

     1  // Copyright 2021 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package caasmodelconfigmanager
     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/api/base"
    13  	"github.com/juju/juju/caas"
    14  	"github.com/juju/juju/docker/registry"
    15  )
    16  
    17  // ManifoldConfig describes how to configure and construct a Worker,
    18  // and what registered resources it may depend upon.
    19  type ManifoldConfig struct {
    20  	APICallerName string
    21  	BrokerName    string
    22  
    23  	NewFacade func(base.APICaller) (Facade, error)
    24  	NewWorker func(Config) (worker.Worker, error)
    25  
    26  	Logger Logger
    27  	Clock  clock.Clock
    28  }
    29  
    30  // Validate is called by start to check for bad configuration.
    31  func (config ManifoldConfig) Validate() error {
    32  	if config.APICallerName == "" {
    33  		return errors.NotValidf("empty APICallerName")
    34  	}
    35  	if config.BrokerName == "" {
    36  		return errors.NotValidf("empty BrokerName")
    37  	}
    38  	if config.NewFacade == nil {
    39  		return errors.NotValidf("nil NewFacade")
    40  	}
    41  	if config.NewWorker == nil {
    42  		return errors.NotValidf("nil NewWorker")
    43  	}
    44  	if config.Logger == nil {
    45  		return errors.NotValidf("nil Logger")
    46  	}
    47  	if config.Clock == nil {
    48  		return errors.NotValidf("nil Clock")
    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  	modelTag, ok := apiCaller.ModelTag()
    69  	if !ok {
    70  		return nil, errors.New("API connection is controller-only (should never happen)")
    71  	}
    72  
    73  	facade, err := config.NewFacade(apiCaller)
    74  	if err != nil {
    75  		return nil, errors.Trace(err)
    76  	}
    77  	worker, err := config.NewWorker(Config{
    78  		ModelTag:     modelTag,
    79  		Facade:       facade,
    80  		Broker:       broker,
    81  		Logger:       config.Logger,
    82  		RegistryFunc: registry.New,
    83  		Clock:        config.Clock,
    84  	})
    85  	if err != nil {
    86  		return nil, errors.Trace(err)
    87  	}
    88  	return worker, nil
    89  }
    90  
    91  // Manifold returns a dependency.Manifold that will run a Worker as
    92  // configured.
    93  func Manifold(config ManifoldConfig) dependency.Manifold {
    94  	return dependency.Manifold{
    95  		Inputs: []string{
    96  			config.APICallerName,
    97  			config.BrokerName,
    98  		},
    99  		Start: config.start,
   100  	}
   101  }