github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/caasmodelupgrader/manifold.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package caasmodelupgrader
     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/api/base"
    13  	"github.com/juju/juju/worker/gate"
    14  )
    15  
    16  // ManifoldConfig describes how to configure and construct a Worker,
    17  // and what registered resources it may depend upon.
    18  type ManifoldConfig struct {
    19  	APICallerName string
    20  	GateName      string
    21  	ModelTag      names.ModelTag
    22  
    23  	NewFacade func(base.APICaller) (Facade, error)
    24  	NewWorker func(Config) (worker.Worker, error)
    25  }
    26  
    27  func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) {
    28  
    29  	var apiCaller base.APICaller
    30  	if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    31  		return nil, errors.Trace(err)
    32  	}
    33  
    34  	var gate gate.Unlocker
    35  	if err := context.Get(config.GateName, &gate); err != nil {
    36  		return nil, errors.Trace(err)
    37  	}
    38  
    39  	facade, err := config.NewFacade(apiCaller)
    40  	if err != nil {
    41  		return nil, errors.Trace(err)
    42  	}
    43  
    44  	worker, err := config.NewWorker(Config{
    45  		Facade:       facade,
    46  		GateUnlocker: gate,
    47  		ModelTag:     config.ModelTag,
    48  	})
    49  	if err != nil {
    50  		return nil, errors.Trace(err)
    51  	}
    52  	return worker, nil
    53  }
    54  
    55  // Manifold returns a dependency.Manifold that will run a Worker as
    56  // configured.
    57  func Manifold(config ManifoldConfig) dependency.Manifold {
    58  	return dependency.Manifold{
    59  		Inputs: []string{
    60  			config.APICallerName,
    61  			config.GateName,
    62  		},
    63  		Start: config.start,
    64  	}
    65  }