github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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 "gopkg.in/juju/names.v2" 9 "gopkg.in/juju/worker.v1" 10 "gopkg.in/juju/worker.v1/dependency" 11 12 "github.com/juju/juju/agent" 13 apiagent "github.com/juju/juju/api/agent" 14 "github.com/juju/juju/api/base" 15 "github.com/juju/juju/cmd/jujud/agent/engine" 16 "github.com/juju/juju/state/multiwatcher" 17 jworker "github.com/juju/juju/worker" 18 ) 19 20 // ManifoldConfig defines the names of the manifolds on which a Manifold will depend. 21 type ManifoldConfig engine.AgentAPIManifoldConfig 22 23 // Manifold returns a dependency manifold that runs an identity file writer worker, 24 // using the resource names defined in the supplied config. 25 func Manifold(config ManifoldConfig) dependency.Manifold { 26 typedConfig := engine.AgentAPIManifoldConfig(config) 27 return engine.AgentAPIManifold(typedConfig, newWorker) 28 } 29 30 // newWorker trivially wraps NewWorker for use in a engine.AgentAPIManifold. 31 func newWorker(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) { 32 cfg := a.CurrentConfig() 33 34 // Grab the tag and ensure that it's for a machine. 35 tag, ok := cfg.Tag().(names.MachineTag) 36 if !ok { 37 return nil, errors.New("this manifold may only be used inside a machine agent") 38 } 39 40 // Get the machine agent's jobs. 41 apiSt, err := apiagent.NewState(apiCaller) 42 if err != nil { 43 return nil, errors.Trace(err) 44 } 45 entity, err := apiSt.Entity(tag) 46 if err != nil { 47 return nil, err 48 } 49 var isModelManager bool 50 for _, job := range entity.Jobs() { 51 if job == multiwatcher.JobManageModel { 52 isModelManager = true 53 break 54 } 55 } 56 57 if !isModelManager { 58 return nil, dependency.ErrMissing 59 } 60 61 return NewWorker(cfg) 62 } 63 64 var NewWorker = func(agentConfig agent.Config) (worker.Worker, error) { 65 inner := func(<-chan struct{}) error { 66 return agent.WriteSystemIdentityFile(agentConfig) 67 } 68 return jworker.NewSimpleWorker(inner), nil 69 }