github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/caasupgrader/manifold.go (about)

     1  // Copyright 2019 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package caasupgrader
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/version/v2"
     9  	"github.com/juju/worker/v3"
    10  	"github.com/juju/worker/v3/dependency"
    11  
    12  	"github.com/juju/juju/agent"
    13  	"github.com/juju/juju/api/agent/upgrader"
    14  	"github.com/juju/juju/api/base"
    15  	"github.com/juju/juju/api/controller/caasoperatorupgrader"
    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  
    37  	// The machine agent uses these but the application agent doesn't.
    38  	if config.UpgradeStepsGateName != "" {
    39  		inputs = append(inputs, config.UpgradeStepsGateName)
    40  	}
    41  	if config.UpgradeCheckGateName != "" {
    42  		inputs = append(inputs, config.UpgradeCheckGateName)
    43  	}
    44  
    45  	return dependency.Manifold{
    46  		Inputs: inputs,
    47  		Start: func(context dependency.Context) (worker.Worker, error) {
    48  			if config.PreviousAgentVersion == version.Zero {
    49  				return nil, errors.New("previous agent version not specified")
    50  			}
    51  
    52  			var agent agent.Agent
    53  			if err := context.Get(config.AgentName, &agent); err != nil {
    54  				return nil, err
    55  			}
    56  			currentConfig := agent.CurrentConfig()
    57  
    58  			var apiCaller base.APICaller
    59  			if err := context.Get(config.APICallerName, &apiCaller); err != nil {
    60  				return nil, err
    61  			}
    62  
    63  			upgraderFacade := upgrader.NewState(apiCaller)
    64  			operatorUpgraderFacade := caasoperatorupgrader.NewClient(apiCaller)
    65  
    66  			var upgradeStepsWaiter gate.Waiter
    67  			if config.UpgradeStepsGateName == "" {
    68  				upgradeStepsWaiter = gate.NewLock()
    69  			} else {
    70  				if config.PreviousAgentVersion == version.Zero {
    71  					return nil, errors.New("previous agent version not specified")
    72  				}
    73  				if err := context.Get(config.UpgradeStepsGateName, &upgradeStepsWaiter); err != nil {
    74  					return nil, err
    75  				}
    76  			}
    77  
    78  			var initialCheckUnlocker gate.Unlocker
    79  			if config.UpgradeCheckGateName == "" {
    80  				initialCheckUnlocker = gate.NewLock()
    81  			} else {
    82  				if err := context.Get(config.UpgradeCheckGateName, &initialCheckUnlocker); err != nil {
    83  					return nil, err
    84  				}
    85  			}
    86  
    87  			return NewUpgrader(Config{
    88  				UpgraderClient:              upgraderFacade,
    89  				CAASOperatorUpgrader:        operatorUpgraderFacade,
    90  				AgentTag:                    currentConfig.Tag(),
    91  				OrigAgentVersion:            config.PreviousAgentVersion,
    92  				UpgradeStepsWaiter:          upgradeStepsWaiter,
    93  				InitialUpgradeCheckComplete: initialCheckUnlocker,
    94  			})
    95  		},
    96  	}
    97  }