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 }