github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/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/utils/clock"
     9  	"gopkg.in/juju/names.v2"
    10  
    11  	"github.com/juju/juju/agent"
    12  	"github.com/juju/juju/api"
    13  	"github.com/juju/juju/api/uniter"
    14  	"github.com/juju/juju/apiserver/params"
    15  	"github.com/juju/juju/core/leadership"
    16  	"github.com/juju/juju/worker"
    17  	"github.com/juju/juju/worker/dependency"
    18  	"github.com/juju/juju/worker/fortress"
    19  	"github.com/juju/juju/worker/uniter/operation"
    20  )
    21  
    22  // ManifoldConfig defines the names of the manifolds on which a
    23  // Manifold will depend.
    24  type ManifoldConfig struct {
    25  	AgentName             string
    26  	APICallerName         string
    27  	MachineLockName       string
    28  	Clock                 clock.Clock
    29  	LeadershipTrackerName string
    30  	CharmDirName          string
    31  	HookRetryStrategyName string
    32  }
    33  
    34  // Manifold returns a dependency manifold that runs a uniter worker,
    35  // using the resource names defined in the supplied config.
    36  func Manifold(config ManifoldConfig) dependency.Manifold {
    37  	return dependency.Manifold{
    38  		Inputs: []string{
    39  			config.AgentName,
    40  			config.APICallerName,
    41  			config.LeadershipTrackerName,
    42  			config.CharmDirName,
    43  			config.HookRetryStrategyName,
    44  		},
    45  		Start: func(context dependency.Context) (worker.Worker, error) {
    46  			if config.Clock == nil {
    47  				return nil, errors.NotValidf("missing Clock")
    48  			}
    49  			if config.MachineLockName == "" {
    50  				return nil, errors.NotValidf("missing MachineLockName")
    51  			}
    52  
    53  			// Collect all required resources.
    54  			var agent agent.Agent
    55  			if err := context.Get(config.AgentName, &agent); err != nil {
    56  				return nil, err
    57  			}
    58  			var apiConn api.Connection
    59  			if err := context.Get(config.APICallerName, &apiConn); err != nil {
    60  				// TODO(fwereade): absence of an APICaller shouldn't be the end of
    61  				// the world -- we ought to return a type that can at least run the
    62  				// leader-deposed hook -- but that's not done yet.
    63  				return nil, err
    64  			}
    65  			var leadershipTracker leadership.Tracker
    66  			if err := context.Get(config.LeadershipTrackerName, &leadershipTracker); err != nil {
    67  				return nil, err
    68  			}
    69  			var charmDirGuard fortress.Guard
    70  			if err := context.Get(config.CharmDirName, &charmDirGuard); err != nil {
    71  				return nil, err
    72  			}
    73  
    74  			var hookRetryStrategy params.RetryStrategy
    75  			if err := context.Get(config.HookRetryStrategyName, &hookRetryStrategy); err != nil {
    76  				return nil, err
    77  			}
    78  
    79  			downloader := api.NewCharmDownloader(apiConn.Client())
    80  
    81  			manifoldConfig := config
    82  			// Configure and start the uniter.
    83  			agentConfig := agent.CurrentConfig()
    84  			tag := agentConfig.Tag()
    85  			unitTag, ok := tag.(names.UnitTag)
    86  			if !ok {
    87  				return nil, errors.Errorf("expected a unit tag, got %v", tag)
    88  			}
    89  			uniterFacade := uniter.NewState(apiConn, unitTag)
    90  			uniter, err := NewUniter(&UniterParams{
    91  				UniterFacade:         uniterFacade,
    92  				UnitTag:              unitTag,
    93  				LeadershipTracker:    leadershipTracker,
    94  				DataDir:              agentConfig.DataDir(),
    95  				Downloader:           downloader,
    96  				MachineLockName:      manifoldConfig.MachineLockName,
    97  				CharmDirGuard:        charmDirGuard,
    98  				UpdateStatusSignal:   NewUpdateStatusTimer(),
    99  				HookRetryStrategy:    hookRetryStrategy,
   100  				NewOperationExecutor: operation.NewExecutor,
   101  				Clock:                manifoldConfig.Clock,
   102  			})
   103  			if err != nil {
   104  				return nil, errors.Trace(err)
   105  			}
   106  			return uniter, nil
   107  		},
   108  	}
   109  }