github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/worker/lifeflag/manifold.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package lifeflag
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"gopkg.in/juju/names.v2"
     9  
    10  	"github.com/juju/juju/api/base"
    11  	"github.com/juju/juju/cmd/jujud/agent/engine"
    12  	"github.com/juju/juju/core/life"
    13  	"github.com/juju/juju/worker"
    14  	"github.com/juju/juju/worker/dependency"
    15  )
    16  
    17  // ManifoldConfig describes how to configure and construct a Worker,
    18  // and what registered resources it may depend upon.
    19  type ManifoldConfig struct {
    20  	APICallerName string
    21  	Entity        names.Tag
    22  	Result        life.Predicate
    23  	Filter        dependency.FilterFunc
    24  
    25  	NewFacade func(base.APICaller) (Facade, error)
    26  	NewWorker func(Config) (worker.Worker, error)
    27  }
    28  
    29  func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) {
    30  
    31  	var apiCaller base.APICaller
    32  	if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    33  		return nil, errors.Trace(err)
    34  	}
    35  	facade, err := config.NewFacade(apiCaller)
    36  	if err != nil {
    37  		return nil, errors.Trace(err)
    38  	}
    39  
    40  	worker, err := config.NewWorker(Config{
    41  		Facade: facade,
    42  		Entity: config.Entity,
    43  		Result: config.Result,
    44  	})
    45  	if err != nil {
    46  		return nil, errors.Trace(err)
    47  	}
    48  	return worker, nil
    49  }
    50  
    51  // Manifold returns a dependency.Manifold that will run a Worker as
    52  // configured.
    53  func Manifold(config ManifoldConfig) dependency.Manifold {
    54  	return dependency.Manifold{
    55  		Inputs: []string{config.APICallerName},
    56  		Start:  config.start,
    57  		Output: engine.FlagOutput,
    58  		Filter: config.Filter,
    59  	}
    60  }