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

     1  // Copyright 2023 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package secretspruner
     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/api/controller/usersecrets"
    13  )
    14  
    15  // ManifoldConfig describes the resources used by the secretspruner worker.
    16  type ManifoldConfig struct {
    17  	APICallerName string
    18  	Logger        Logger
    19  
    20  	NewUserSecretsFacade func(base.APICaller) SecretsFacade
    21  	NewWorker            func(Config) (worker.Worker, error)
    22  }
    23  
    24  // NewUserSecretsFacade returns a new SecretsFacade.
    25  func NewUserSecretsFacade(caller base.APICaller) SecretsFacade {
    26  	return usersecrets.NewClient(caller)
    27  }
    28  
    29  // Manifold returns a Manifold that encapsulates the secretspruner worker.
    30  func Manifold(config ManifoldConfig) dependency.Manifold {
    31  	return dependency.Manifold{
    32  		Inputs: []string{
    33  			config.APICallerName,
    34  		},
    35  		Start: config.start,
    36  	}
    37  }
    38  
    39  // Validate is called by start to check for bad configuration.
    40  func (cfg ManifoldConfig) Validate() error {
    41  	if cfg.APICallerName == "" {
    42  		return errors.NotValidf("empty APICallerName")
    43  	}
    44  	if cfg.Logger == nil {
    45  		return errors.NotValidf("nil Logger")
    46  	}
    47  	if cfg.NewUserSecretsFacade == nil {
    48  		return errors.NotValidf("nil NewUserSecretsFacade")
    49  	}
    50  	if cfg.NewWorker == nil {
    51  		return errors.NotValidf("nil NewWorker")
    52  	}
    53  	return nil
    54  }
    55  
    56  // start is a StartFunc for a Worker manifold.
    57  func (cfg ManifoldConfig) start(context dependency.Context) (worker.Worker, error) {
    58  	if err := cfg.Validate(); err != nil {
    59  		return nil, errors.Trace(err)
    60  	}
    61  
    62  	var apiCaller base.APICaller
    63  	if err := context.Get(cfg.APICallerName, &apiCaller); err != nil {
    64  		return nil, errors.Trace(err)
    65  	}
    66  
    67  	worker, err := cfg.NewWorker(Config{
    68  		SecretsFacade: cfg.NewUserSecretsFacade(apiCaller),
    69  		Logger:        cfg.Logger,
    70  	})
    71  	if err != nil {
    72  		return nil, errors.Trace(err)
    73  	}
    74  	return worker, nil
    75  }