diff --git a/agent/agent.go b/agent/agent.go index 0ae753b1ce..83de1b3579 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -750,6 +750,9 @@ func (a *Agent) consulConfig() (*consul.Config, error) { if a.config.Autopilot.DisableUpgradeMigration != nil { base.AutopilotConfig.DisableUpgradeMigration = *a.config.Autopilot.DisableUpgradeMigration } + if a.config.Autopilot.UpgradeVersionTag != "" { + base.AutopilotConfig.UpgradeVersionTag = a.config.Autopilot.UpgradeVersionTag + } // make sure the advertise address is always set if base.RPCAdvertise == nil { diff --git a/agent/config.go b/agent/config.go index 33b537abc8..d7af3a2626 100644 --- a/agent/config.go +++ b/agent/config.go @@ -324,6 +324,10 @@ type Autopilot struct { // strategy of waiting until enough newer-versioned servers have been added to the // cluster before promoting them to voters. DisableUpgradeMigration *bool `mapstructure:"disable_upgrade_migration"` + + // (Enterprise-only) UpgradeVersionTag is the node tag to use for version info when + // performing upgrade migrations. If left blank, the Consul version will be used. + UpgradeVersionTag string `mapstructure:"upgrade_version_tag"` } // Config is the configuration that can be set for an Agent. @@ -1687,6 +1691,9 @@ func MergeConfig(a, b *Config) *Config { if b.Autopilot.DisableUpgradeMigration != nil { result.Autopilot.DisableUpgradeMigration = b.Autopilot.DisableUpgradeMigration } + if b.Autopilot.UpgradeVersionTag != "" { + result.Autopilot.UpgradeVersionTag = b.Autopilot.UpgradeVersionTag + } if b.Telemetry.DisableHostname == true { result.Telemetry.DisableHostname = true } diff --git a/agent/config_test.go b/agent/config_test.go index 368111c1ba..0d988314e2 100644 --- a/agent/config_test.go +++ b/agent/config_test.go @@ -181,6 +181,10 @@ func TestDecodeConfig(t *testing.T) { in: `{"autopilot":{"disable_upgrade_migration":true}}`, c: &Config{Autopilot: Autopilot{DisableUpgradeMigration: Bool(true)}}, }, + { + in: `{"autopilot":{"upgrade_version_tag":"rev"}}`, + c: &Config{Autopilot: Autopilot{UpgradeVersionTag: "rev"}}, + }, { in: `{"autopilot":{"last_contact_threshold":"2s"}}`, c: &Config{Autopilot: Autopilot{LastContactThreshold: Duration(2 * time.Second), LastContactThresholdRaw: "2s"}}, diff --git a/agent/consul/state/autopilot_test.go b/agent/consul/state/autopilot_test.go index 91187a473e..545c7e4b21 100644 --- a/agent/consul/state/autopilot_test.go +++ b/agent/consul/state/autopilot_test.go @@ -3,6 +3,7 @@ package state import ( "reflect" "testing" + "time" "github.com/hashicorp/consul/agent/consul/structs" ) @@ -11,7 +12,13 @@ func TestStateStore_Autopilot(t *testing.T) { s := testStateStore(t) expected := &structs.AutopilotConfig{ - CleanupDeadServers: true, + CleanupDeadServers: true, + LastContactThreshold: 5 * time.Second, + MaxTrailingLogs: 500, + ServerStabilizationTime: 100 * time.Second, + RedundancyZoneTag: "az", + DisableUpgradeMigration: true, + UpgradeVersionTag: "build", } if err := s.AutopilotSetConfig(0, expected); err != nil { diff --git a/agent/consul/structs/operator.go b/agent/consul/structs/operator.go index 332d9e556d..3bafa9f566 100644 --- a/agent/consul/structs/operator.go +++ b/agent/consul/structs/operator.go @@ -35,6 +35,10 @@ type AutopilotConfig struct { // cluster before promoting them to voters. DisableUpgradeMigration bool + // (Enterprise-only) UpgradeVersionTag is the node tag to use for version info when + // performing upgrade migrations. If left blank, the Consul version will be used. + UpgradeVersionTag string + // RaftIndex stores the create/modify indexes of this configuration. RaftIndex } diff --git a/api/operator_autopilot.go b/api/operator_autopilot.go index 59471ecf99..0fa9d16040 100644 --- a/api/operator_autopilot.go +++ b/api/operator_autopilot.go @@ -39,6 +39,10 @@ type AutopilotConfiguration struct { // cluster before promoting them to voters. DisableUpgradeMigration bool + // (Enterprise-only) UpgradeVersionTag is the node tag to use for version info when + // performing upgrade migrations. If left blank, the Consul version will be used. + UpgradeVersionTag string + // CreateIndex holds the index corresponding the creation of this configuration. // This is a read-only field. CreateIndex uint64