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

     1  // Copyright 2023 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package secretsdrainworker
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/worker/v3"
     9  	"github.com/juju/worker/v3/dependency"
    10  
    11  	agentsecretsdrain "github.com/juju/juju/api/agent/secretsdrain"
    12  	"github.com/juju/juju/api/agent/secretsmanager"
    13  	"github.com/juju/juju/api/base"
    14  	"github.com/juju/juju/api/controller/usersecretsdrain"
    15  	jujusecrets "github.com/juju/juju/secrets"
    16  )
    17  
    18  // ManifoldConfig describes the resources used by the secretsdrainworker worker.
    19  type ManifoldConfig struct {
    20  	APICallerName string
    21  	Logger        Logger
    22  
    23  	NewSecretsDrainFacade func(base.APICaller) SecretsDrainFacade
    24  	NewWorker             func(Config) (worker.Worker, error)
    25  	NewBackendsClient     func(base.APICaller) (jujusecrets.BackendsClient, error)
    26  }
    27  
    28  // NewSecretsDrainFacadeForAgent returns a new SecretsDrainFacade for draining charm owned secrets from agents.
    29  func NewSecretsDrainFacadeForAgent(caller base.APICaller) SecretsDrainFacade {
    30  	return agentsecretsdrain.NewClient(caller)
    31  }
    32  
    33  // NewUserSecretsDrainFacade returns a new SecretsDrainFacade for draining user secrets from controller.
    34  func NewUserSecretsDrainFacade(caller base.APICaller) SecretsDrainFacade {
    35  	return usersecretsdrain.NewClient(caller)
    36  }
    37  
    38  // NewSecretBackendsClientForAgent returns a new secret backends client for draining charm owned secrets from agents.
    39  func NewSecretBackendsClientForAgent(caller base.APICaller) (jujusecrets.BackendsClient, error) {
    40  	facade := secretsmanager.NewClient(caller)
    41  	return jujusecrets.NewClient(facade)
    42  }
    43  
    44  // NewUserSecretBackendsClient returns a new secret backends client for draining user secrets from controller.
    45  func NewUserSecretBackendsClient(caller base.APICaller) (jujusecrets.BackendsClient, error) {
    46  	facade := usersecretsdrain.NewClient(caller)
    47  	return jujusecrets.NewClient(facade)
    48  }
    49  
    50  // Manifold returns a Manifold that encapsulates the secretsdrainworker worker.
    51  func Manifold(config ManifoldConfig) dependency.Manifold {
    52  	return dependency.Manifold{
    53  		Inputs: []string{
    54  			config.APICallerName,
    55  		},
    56  		Start: config.start,
    57  	}
    58  }
    59  
    60  // Validate is called by start to check for bad configuration.
    61  func (cfg ManifoldConfig) Validate() error {
    62  	if cfg.APICallerName == "" {
    63  		return errors.NotValidf("empty APICallerName")
    64  	}
    65  	if cfg.Logger == nil {
    66  		return errors.NotValidf("nil Logger")
    67  	}
    68  	if cfg.NewSecretsDrainFacade == nil {
    69  		return errors.NotValidf("nil NewSecretsDrainFacade")
    70  	}
    71  	if cfg.NewWorker == nil {
    72  		return errors.NotValidf("nil NewWorker")
    73  	}
    74  	if cfg.NewBackendsClient == nil {
    75  		return errors.NotValidf("nil NewBackendsClient")
    76  	}
    77  	return nil
    78  }
    79  
    80  // start is a StartFunc for a Worker manifold.
    81  func (cfg ManifoldConfig) start(context dependency.Context) (worker.Worker, error) {
    82  	if err := cfg.Validate(); err != nil {
    83  		return nil, errors.Trace(err)
    84  	}
    85  
    86  	var apiCaller base.APICaller
    87  	if err := context.Get(cfg.APICallerName, &apiCaller); err != nil {
    88  		return nil, errors.Trace(err)
    89  	}
    90  
    91  	worker, err := cfg.NewWorker(Config{
    92  		SecretsDrainFacade: cfg.NewSecretsDrainFacade(apiCaller),
    93  		Logger:             cfg.Logger,
    94  		SecretsBackendGetter: func() (jujusecrets.BackendsClient, error) {
    95  			return cfg.NewBackendsClient(apiCaller)
    96  		},
    97  	})
    98  	if err != nil {
    99  		return nil, errors.Trace(err)
   100  	}
   101  	return worker, nil
   102  }