mirror of https://github.com/status-im/consul.git
upgrade test: call validation func during upgrade (#20258)
This commit is contained in:
parent
9897be76ad
commit
539659508a
|
@ -27,7 +27,7 @@ func Test_Upgrade_Standard_Basic_Agentless(t *testing.T) {
|
||||||
sp := ct.Sprawl
|
sp := ct.Sprawl
|
||||||
cfg := sp.Config()
|
cfg := sp.Config()
|
||||||
require.NoError(t, ct.Sprawl.LoadKVDataToCluster("dc1", 1, &api.WriteOptions{}))
|
require.NoError(t, ct.Sprawl.LoadKVDataToCluster("dc1", 1, &api.WriteOptions{}))
|
||||||
require.NoError(t, sp.Upgrade(cfg, "dc1", sprawl.UpgradeTypeStandard, utils.TargetImages(), nil))
|
require.NoError(t, sp.Upgrade(cfg, "dc1", sprawl.UpgradeTypeStandard, utils.TargetImages(), nil, nil))
|
||||||
t.Log("Finished standard upgrade ...")
|
t.Log("Finished standard upgrade ...")
|
||||||
|
|
||||||
// verify data is not lost
|
// verify data is not lost
|
||||||
|
|
|
@ -54,7 +54,7 @@ func TestTrafficManagement_ResolverDefaultSubset_Agentless(t *testing.T) {
|
||||||
sp := ct.Sprawl
|
sp := ct.Sprawl
|
||||||
cfg := sp.Config()
|
cfg := sp.Config()
|
||||||
require.NoError(t, ct.Sprawl.LoadKVDataToCluster("dc1", 1, &api.WriteOptions{}))
|
require.NoError(t, ct.Sprawl.LoadKVDataToCluster("dc1", 1, &api.WriteOptions{}))
|
||||||
require.NoError(t, sp.Upgrade(cfg, "dc1", sprawl.UpgradeTypeStandard, utils.TargetImages(), nil))
|
require.NoError(t, sp.Upgrade(cfg, "dc1", sprawl.UpgradeTypeStandard, utils.TargetImages(), nil, nil))
|
||||||
t.Log("Finished standard upgrade ...")
|
t.Log("Finished standard upgrade ...")
|
||||||
|
|
||||||
// verify data is not lost
|
// verify data is not lost
|
||||||
|
|
|
@ -246,12 +246,20 @@ func (s *Sprawl) Relaunch(
|
||||||
return s.RelaunchWithPhase(cfg, LaunchPhaseRegular)
|
return s.RelaunchWithPhase(cfg, LaunchPhaseRegular)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Upgrade upgrades the cluster to the targetImages version
|
||||||
|
// Parameters:
|
||||||
|
// - clusterName: the cluster to upgrade
|
||||||
|
// - upgradeType: the type of upgrade, standard or autopilot
|
||||||
|
// - targetImages: the target version to upgrade to
|
||||||
|
// - newServersInTopology: the number of new servers to add to the topology for autopilot upgrade only
|
||||||
|
// - validationFunc: the validation function to run during upgrade
|
||||||
func (s *Sprawl) Upgrade(
|
func (s *Sprawl) Upgrade(
|
||||||
cfg *topology.Config,
|
cfg *topology.Config,
|
||||||
clusterName string,
|
clusterName string,
|
||||||
upgradeType string,
|
upgradeType string,
|
||||||
targetImages topology.Images,
|
targetImages topology.Images,
|
||||||
newServersInTopology []int,
|
newServersInTopology []int,
|
||||||
|
validationFunc func() error,
|
||||||
) error {
|
) error {
|
||||||
cluster := cfg.Cluster(clusterName)
|
cluster := cfg.Cluster(clusterName)
|
||||||
if cluster == nil {
|
if cluster == nil {
|
||||||
|
@ -266,9 +274,9 @@ func (s *Sprawl) Upgrade(
|
||||||
|
|
||||||
switch upgradeType {
|
switch upgradeType {
|
||||||
case UpgradeTypeAutopilot:
|
case UpgradeTypeAutopilot:
|
||||||
err = s.autopilotUpgrade(cfg, cluster, newServersInTopology)
|
err = s.autopilotUpgrade(cfg, cluster, newServersInTopology, validationFunc)
|
||||||
case UpgradeTypeStandard:
|
case UpgradeTypeStandard:
|
||||||
err = s.standardUpgrade(cluster, targetImages)
|
err = s.standardUpgrade(cluster, targetImages, validationFunc)
|
||||||
default:
|
default:
|
||||||
err = fmt.Errorf("upgrade type unsupported %s", upgradeType)
|
err = fmt.Errorf("upgrade type unsupported %s", upgradeType)
|
||||||
}
|
}
|
||||||
|
@ -283,7 +291,7 @@ func (s *Sprawl) Upgrade(
|
||||||
// standardUpgrade upgrades server agents in the cluster to the targetImages
|
// standardUpgrade upgrades server agents in the cluster to the targetImages
|
||||||
// individually
|
// individually
|
||||||
func (s *Sprawl) standardUpgrade(cluster *topology.Cluster,
|
func (s *Sprawl) standardUpgrade(cluster *topology.Cluster,
|
||||||
targetImages topology.Images) error {
|
targetImages topology.Images, validationFunc func() error) error {
|
||||||
upgradeFn := func(nodeID topology.NodeID) error {
|
upgradeFn := func(nodeID topology.NodeID) error {
|
||||||
cfgUpgrade := s.Config()
|
cfgUpgrade := s.Config()
|
||||||
clusterCopy := cfgUpgrade.Cluster(cluster.Name)
|
clusterCopy := cfgUpgrade.Cluster(cluster.Name)
|
||||||
|
@ -311,6 +319,13 @@ func (s *Sprawl) standardUpgrade(cluster *topology.Cluster,
|
||||||
if err := upgradeFn(node.ID()); err != nil {
|
if err := upgradeFn(node.ID()); err != nil {
|
||||||
return fmt.Errorf("error upgrading node %s: %w", node.Name, err)
|
return fmt.Errorf("error upgrading node %s: %w", node.Name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// run the validation function after upgrading each server agent
|
||||||
|
if validationFunc != nil {
|
||||||
|
if err := validationFunc(); err != nil {
|
||||||
|
return fmt.Errorf("error validating cluster: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// upgrade client agents one at a time
|
// upgrade client agents one at a time
|
||||||
|
@ -322,6 +337,13 @@ func (s *Sprawl) standardUpgrade(cluster *topology.Cluster,
|
||||||
if err := upgradeFn(node.ID()); err != nil {
|
if err := upgradeFn(node.ID()); err != nil {
|
||||||
return fmt.Errorf("error upgrading node %s: %w", node.Name, err)
|
return fmt.Errorf("error upgrading node %s: %w", node.Name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// run the validation function after upgrading each client agent
|
||||||
|
if validationFunc != nil {
|
||||||
|
if err := validationFunc(); err != nil {
|
||||||
|
return fmt.Errorf("error validating cluster: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -330,7 +352,7 @@ func (s *Sprawl) standardUpgrade(cluster *topology.Cluster,
|
||||||
// autopilotUpgrade upgrades server agents by joining new servers with
|
// autopilotUpgrade upgrades server agents by joining new servers with
|
||||||
// higher version. After upgrade completes, the number of server agents
|
// higher version. After upgrade completes, the number of server agents
|
||||||
// are doubled
|
// are doubled
|
||||||
func (s *Sprawl) autopilotUpgrade(cfg *topology.Config, cluster *topology.Cluster, newServersInTopology []int) error {
|
func (s *Sprawl) autopilotUpgrade(cfg *topology.Config, cluster *topology.Cluster, newServersInTopology []int, validationFunc func() error) error {
|
||||||
leader, err := s.Leader(cluster.Name)
|
leader, err := s.Leader(cluster.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error get leader: %w", err)
|
return fmt.Errorf("error get leader: %w", err)
|
||||||
|
@ -393,9 +415,18 @@ func (s *Sprawl) autopilotUpgrade(cfg *topology.Config, cluster *topology.Cluste
|
||||||
node.IsNewServer = false
|
node.IsNewServer = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Run the validation code
|
||||||
|
if validationFunc != nil {
|
||||||
|
if err := validationFunc(); err != nil {
|
||||||
|
return fmt.Errorf("error validating cluster: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RelaunchWithPhase relaunch the toplogy with the given phase
|
||||||
|
// and wait for the cluster to be ready (i.e, leadership is established)
|
||||||
func (s *Sprawl) RelaunchWithPhase(
|
func (s *Sprawl) RelaunchWithPhase(
|
||||||
cfg *topology.Config,
|
cfg *topology.Config,
|
||||||
launchPhase LaunchPhase,
|
launchPhase LaunchPhase,
|
||||||
|
|
Loading…
Reference in New Issue