github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/upgrader/manifold.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package upgrader
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  
     9  	"github.com/juju/juju/agent"
    10  	"github.com/juju/juju/api/base"
    11  	"github.com/juju/juju/api/upgrader"
    12  	"github.com/juju/juju/worker"
    13  	"github.com/juju/juju/worker/dependency"
    14  	"github.com/juju/juju/worker/gate"
    15  	"github.com/juju/version"
    16  )
    17  
    18  // ManifoldConfig defines the names of the manifolds on which a
    19  // Manifold will depend.
    20  type ManifoldConfig struct {
    21  	AgentName            string
    22  	APICallerName        string
    23  	UpgradeStepsGateName string
    24  	UpgradeCheckGateName string
    25  	PreviousAgentVersion version.Number
    26  }
    27  
    28  // Manifold returns a dependency manifold that runs an upgrader
    29  // worker, using the resource names defined in the supplied config.
    30  func Manifold(config ManifoldConfig) dependency.Manifold {
    31  	inputs := []string{
    32  		config.AgentName,
    33  		config.APICallerName,
    34  	}
    35  	// The machine agent uses these but the unit agent doesn't.
    36  	if config.UpgradeStepsGateName != "" {
    37  		inputs = append(inputs, config.UpgradeStepsGateName)
    38  	}
    39  	if config.UpgradeCheckGateName != "" {
    40  		inputs = append(inputs, config.UpgradeCheckGateName)
    41  	}
    42  
    43  	return dependency.Manifold{
    44  		Inputs: inputs,
    45  		Start: func(context dependency.Context) (worker.Worker, error) {
    46  
    47  			var agent agent.Agent
    48  			if err := context.Get(config.AgentName, &agent); err != nil {
    49  				return nil, err
    50  			}
    51  			currentConfig := agent.CurrentConfig()
    52  
    53  			var apiCaller base.APICaller
    54  			if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    55  				return nil, err
    56  			}
    57  			upgraderFacade := upgrader.NewState(apiCaller)
    58  
    59  			var upgradeStepsWaiter gate.Waiter
    60  			if config.UpgradeStepsGateName == "" {
    61  				upgradeStepsWaiter = gate.NewLock()
    62  			} else {
    63  				if config.PreviousAgentVersion == version.Zero {
    64  					return nil, errors.New("previous agent version not specified")
    65  				}
    66  				if err := context.Get(config.UpgradeStepsGateName, &upgradeStepsWaiter); err != nil {
    67  					return nil, err
    68  				}
    69  			}
    70  
    71  			var initialCheckUnlocker gate.Unlocker
    72  			if config.UpgradeCheckGateName == "" {
    73  				initialCheckUnlocker = gate.NewLock()
    74  			} else {
    75  				if err := context.Get(config.UpgradeCheckGateName, &initialCheckUnlocker); err != nil {
    76  					return nil, err
    77  				}
    78  			}
    79  
    80  			return NewAgentUpgrader(
    81  				upgraderFacade,
    82  				currentConfig,
    83  				config.PreviousAgentVersion,
    84  				upgradeStepsWaiter,
    85  				initialCheckUnlocker,
    86  			)
    87  		},
    88  	}
    89  }