github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/toolsversionchecker/manifold.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package toolsversionchecker 5 6 import ( 7 "time" 8 9 "github.com/juju/errors" 10 "gopkg.in/juju/names.v2" 11 "gopkg.in/juju/worker.v1" 12 "gopkg.in/juju/worker.v1/dependency" 13 14 "github.com/juju/juju/agent" 15 apiagent "github.com/juju/juju/api/agent" 16 "github.com/juju/juju/api/agenttools" 17 "github.com/juju/juju/api/base" 18 "github.com/juju/juju/cmd/jujud/agent/engine" 19 "github.com/juju/juju/state/multiwatcher" 20 ) 21 22 // ManifoldConfig defines the names of the manifolds on which a Manifold will depend. 23 type ManifoldConfig engine.AgentAPIManifoldConfig 24 25 // Manifold returns a dependency manifold that runs a toolsversionchecker worker, 26 // using the api connection resource named in the supplied config. 27 func Manifold(config ManifoldConfig) dependency.Manifold { 28 typedConfig := engine.AgentAPIManifoldConfig(config) 29 return engine.AgentAPIManifold(typedConfig, newWorker) 30 } 31 32 func newWorker(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) { 33 st, err := apiagent.NewState(apiCaller) 34 if err != nil { 35 return nil, errors.Trace(err) 36 } 37 isMM, err := isModelManager(a, st) 38 if err != nil { 39 return nil, errors.Trace(err) 40 } 41 if !isMM { 42 return nil, dependency.ErrMissing 43 } 44 45 // 4 times a day seems a decent enough amount of checks. 46 checkerParams := VersionCheckerParams{ 47 CheckInterval: time.Hour * 6, 48 } 49 return New(agenttools.NewFacade(apiCaller), &checkerParams), nil 50 } 51 52 func isModelManager(a agent.Agent, st *apiagent.State) (bool, error) { 53 cfg := a.CurrentConfig() 54 55 // Grab the tag and ensure that it's for a machine. 56 tag, ok := cfg.Tag().(names.MachineTag) 57 if !ok { 58 return false, errors.New("this manifold may only be used inside a machine agent") 59 } 60 61 entity, err := st.Entity(tag) 62 if err != nil { 63 return false, err 64 } 65 66 for _, job := range entity.Jobs() { 67 if job == multiwatcher.JobManageModel { 68 return true, nil 69 } 70 } 71 72 return false, nil 73 }