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