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  }