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

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package identityfilewriter
     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  	apiagent "github.com/juju/juju/api/agent/agent"
    13  	"github.com/juju/juju/api/base"
    14  	"github.com/juju/juju/cmd/jujud/agent/engine"
    15  	jworker "github.com/juju/juju/worker"
    16  )
    17  
    18  // ManifoldConfig defines the names of the manifolds on which a Manifold will depend.
    19  type ManifoldConfig engine.AgentAPIManifoldConfig
    20  
    21  // Manifold returns a dependency manifold that runs an identity file writer worker,
    22  // using the resource names defined in the supplied config.
    23  func Manifold(config ManifoldConfig) dependency.Manifold {
    24  	typedConfig := engine.AgentAPIManifoldConfig(config)
    25  	return engine.AgentAPIManifold(typedConfig, newWorker)
    26  }
    27  
    28  // newWorker trivially wraps NewWorker for use in a engine.AgentAPIManifold.
    29  func newWorker(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) {
    30  	cfg := a.CurrentConfig()
    31  
    32  	// Grab the tag and ensure that it's for a controller.
    33  	if !apiagent.IsAllowedControllerTag(cfg.Tag().Kind()) {
    34  		return nil, errors.New("this manifold may only be used inside a machine or controller agent")
    35  	}
    36  
    37  	isController, err := apiagent.IsController(apiCaller, cfg.Tag())
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  	if !isController {
    42  		return nil, dependency.ErrMissing
    43  	}
    44  
    45  	return NewWorker(cfg)
    46  }
    47  
    48  var NewWorker = func(agentConfig agent.Config) (worker.Worker, error) {
    49  	inner := func(<-chan struct{}) error {
    50  		return agent.WriteSystemIdentityFile(agentConfig)
    51  	}
    52  	return jworker.NewSimpleWorker(inner), nil
    53  }