github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/caasoperatorprovisioner/manifold.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caasoperatorprovisioner 5 6 import ( 7 "github.com/juju/errors" 8 "gopkg.in/juju/worker.v1" 9 "gopkg.in/juju/worker.v1/dependency" 10 11 "github.com/juju/juju/agent" 12 "github.com/juju/juju/api/base" 13 "github.com/juju/juju/api/caasoperatorprovisioner" 14 "github.com/juju/juju/caas" 15 ) 16 17 // ManifoldConfig defines a CAAS operator provisioner's dependencies. 18 type ManifoldConfig struct { 19 AgentName string 20 APICallerName string 21 BrokerName string 22 23 NewWorker func(Config) (worker.Worker, error) 24 } 25 26 // Validate is called by start to check for bad configuration. 27 func (config ManifoldConfig) Validate() error { 28 if config.AgentName == "" { 29 return errors.NotValidf("empty AgentName") 30 } 31 if config.APICallerName == "" { 32 return errors.NotValidf("empty APICallerName") 33 } 34 if config.BrokerName == "" { 35 return errors.NotValidf("empty BrokerName") 36 } 37 if config.NewWorker == nil { 38 return errors.NotValidf("nil NewWorker") 39 } 40 return nil 41 } 42 43 func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 44 if err := config.Validate(); err != nil { 45 return nil, errors.Trace(err) 46 } 47 48 var agent agent.Agent 49 if err := context.Get(config.AgentName, &agent); err != nil { 50 return nil, errors.Trace(err) 51 } 52 53 var apiCaller base.APICaller 54 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 55 return nil, errors.Trace(err) 56 } 57 58 var broker caas.Broker 59 if err := context.Get(config.BrokerName, &broker); err != nil { 60 return nil, errors.Trace(err) 61 } 62 63 modelTag, ok := apiCaller.ModelTag() 64 if !ok { 65 return nil, errors.New("API connection is controller-only (should never happen)") 66 } 67 68 api := caasoperatorprovisioner.NewClient(apiCaller) 69 agentConfig := agent.CurrentConfig() 70 w, err := config.NewWorker(Config{ 71 Facade: api, 72 Broker: broker, 73 ModelTag: modelTag, 74 AgentConfig: agentConfig, 75 }) 76 if err != nil { 77 return nil, errors.Trace(err) 78 } 79 return w, nil 80 } 81 82 // Manifold creates a manifold that runs a CAAS operator provisioner. See the 83 // ManifoldConfig type for discussion about how this can/should evolve. 84 func Manifold(config ManifoldConfig) dependency.Manifold { 85 return dependency.Manifold{ 86 Inputs: []string{ 87 config.AgentName, 88 config.APICallerName, 89 config.BrokerName, 90 }, 91 Start: config.start, 92 } 93 }