github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/worker/uniter/manifold.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package uniter
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names"
     9  	"github.com/juju/utils/fslock"
    10  
    11  	"github.com/juju/juju/agent"
    12  	"github.com/juju/juju/api/base"
    13  	"github.com/juju/juju/api/uniter"
    14  	"github.com/juju/juju/worker"
    15  	"github.com/juju/juju/worker/dependency"
    16  	"github.com/juju/juju/worker/leadership"
    17  	"github.com/juju/juju/worker/uniter/operation"
    18  )
    19  
    20  // ManifoldConfig defines the names of the manifolds on which a
    21  // Manifold will depend.
    22  type ManifoldConfig struct {
    23  	AgentName             string
    24  	APICallerName         string
    25  	MachineLockName       string
    26  	LeadershipTrackerName string
    27  }
    28  
    29  // Manifold returns a dependency manifold that runs a uniter worker,
    30  // using the resource names defined in the supplied config.
    31  func Manifold(config ManifoldConfig) dependency.Manifold {
    32  	return dependency.Manifold{
    33  		Inputs: []string{
    34  			config.AgentName,
    35  			config.APICallerName,
    36  			config.LeadershipTrackerName,
    37  			config.MachineLockName,
    38  		},
    39  		Start: func(getResource dependency.GetResourceFunc) (worker.Worker, error) {
    40  
    41  			// Collect all required resources.
    42  			var agent agent.Agent
    43  			if err := getResource(config.AgentName, &agent); err != nil {
    44  				return nil, err
    45  			}
    46  			var apiCaller base.APICaller
    47  			if err := getResource(config.APICallerName, &apiCaller); err != nil {
    48  				// TODO(fwereade): absence of an APICaller shouldn't be the end of
    49  				// the world -- we ought to return a type that can at least run the
    50  				// leader-deposed hook -- but that's not done yet.
    51  				return nil, err
    52  			}
    53  			var machineLock *fslock.Lock
    54  			if err := getResource(config.MachineLockName, &machineLock); err != nil {
    55  				return nil, err
    56  			}
    57  			var leadershipTracker leadership.Tracker
    58  			if err := getResource(config.LeadershipTrackerName, &leadershipTracker); err != nil {
    59  				return nil, err
    60  			}
    61  
    62  			// Configure and start the uniter.
    63  			config := agent.CurrentConfig()
    64  			tag := config.Tag()
    65  			unitTag, ok := tag.(names.UnitTag)
    66  			if !ok {
    67  				return nil, errors.Errorf("expected a unit tag, got %v", tag)
    68  			}
    69  			uniterFacade := uniter.NewState(apiCaller, unitTag)
    70  			return NewUniter(&UniterParams{
    71  				UniterFacade:         uniterFacade,
    72  				UnitTag:              unitTag,
    73  				LeadershipTracker:    leadershipTracker,
    74  				DataDir:              config.DataDir(),
    75  				MachineLock:          machineLock,
    76  				MetricsTimerChooser:  NewMetricsTimerChooser(),
    77  				UpdateStatusSignal:   NewUpdateStatusTimer(),
    78  				NewOperationExecutor: operation.NewExecutor,
    79  			}), nil
    80  		},
    81  	}
    82  }