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

     1  // Copyright 2020 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package caasmodeloperator
     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/agent"
    12  	"github.com/juju/juju/api/base"
    13  	"github.com/juju/juju/api/controller/caasmodeloperator"
    14  	"github.com/juju/juju/caas"
    15  )
    16  
    17  // Logger is the interface this work requires for logging.
    18  type Logger interface {
    19  	Debugf(string, ...interface{})
    20  }
    21  
    22  // ManifoldConfig describes the resources used by the CAASModelOperatorWorker
    23  type ManifoldConfig struct {
    24  	// AgentName
    25  	AgentName string
    26  	// APICallerName is the name of the api caller dependency to fetch
    27  	APICallerName string
    28  	// BrokerName is the name of the api caller dependency to fetch
    29  	BrokerName string
    30  	// Logger to use in this worker
    31  	Logger Logger
    32  	// ModelUUID is the id of the model this worker is operating on
    33  
    34  	ModelUUID string
    35  }
    36  
    37  // Manifold returns a Manifold that encapsulates a Kubernetes model operator.
    38  func Manifold(config ManifoldConfig) dependency.Manifold {
    39  	return dependency.Manifold{
    40  		Inputs: []string{
    41  			config.AgentName,
    42  			config.APICallerName,
    43  			config.BrokerName,
    44  		},
    45  		Output: nil,
    46  		Start:  config.Start,
    47  	}
    48  }
    49  
    50  // Start is used to start the manifold an extract a worker from the supplied
    51  // configuration
    52  func (m ManifoldConfig) Start(context dependency.Context) (worker.Worker, error) {
    53  	if err := m.Validate(); err != nil {
    54  		return nil, errors.Trace(err)
    55  	}
    56  
    57  	var agent agent.Agent
    58  	if err := context.Get(m.AgentName, &agent); err != nil {
    59  		return nil, errors.Trace(err)
    60  	}
    61  
    62  	var apiCaller base.APICaller
    63  	if err := context.Get(m.APICallerName, &apiCaller); err != nil {
    64  		return nil, errors.Trace(err)
    65  	}
    66  
    67  	var broker caas.Broker
    68  	if err := context.Get(m.BrokerName, &broker); err != nil {
    69  		return nil, errors.Trace(err)
    70  	}
    71  
    72  	api := caasmodeloperator.NewClient(apiCaller)
    73  
    74  	return NewModelOperatorManager(
    75  		m.Logger, api, broker, m.ModelUUID, agent.CurrentConfig())
    76  }
    77  
    78  // Validate checks all the config fields are valid for the Manifold to start
    79  func (m ManifoldConfig) Validate() error {
    80  	if m.AgentName == "" {
    81  		return errors.NotValidf("empty AgentName")
    82  	}
    83  	if m.APICallerName == "" {
    84  		return errors.NotValidf("empty APICallerName")
    85  	}
    86  	if m.BrokerName == "" {
    87  		return errors.NotValidf("empty BrokerName")
    88  	}
    89  	if m.Logger == nil {
    90  		return errors.NotValidf("nil Logger")
    91  	}
    92  	if m.ModelUUID == "" {
    93  		return errors.NotValidf("empty ModelUUID")
    94  	}
    95  	return nil
    96  }