From ad72ee93c91eedb5d487e10bf873333ab43749ff Mon Sep 17 00:00:00 2001 From: Mahmood Ali Date: Sat, 9 May 2020 12:14:02 -0400 Subject: [PATCH] handle upgrade path and defaults Ensure that `""` Scheduler Algorithm gets explicitly set to binpack on upgrades or on API handling when user misses the value. The scheduler already treats `""` value as binpack. This PR merely ensures that the operator API returns the effective value. --- command/agent/command.go | 2 ++ nomad/fsm.go | 3 +++ nomad/fsm_test.go | 1 + nomad/structs/operator.go | 6 ++++++ 4 files changed, 12 insertions(+) diff --git a/command/agent/command.go b/command/agent/command.go index 7546738e0..76663779a 100644 --- a/command/agent/command.go +++ b/command/agent/command.go @@ -285,6 +285,8 @@ func (c *Command) readConfig() *Config { config.PluginDir = filepath.Join(config.DataDir, "plugins") } + config.Server.DefaultSchedulerConfig.Canonicalize() + if !c.isValidConfig(config, cmdConfig) { return nil } diff --git a/nomad/fsm.go b/nomad/fsm.go index 39280a736..5ce00d388 100644 --- a/nomad/fsm.go +++ b/nomad/fsm.go @@ -1120,6 +1120,8 @@ func (n *nomadFSM) applySchedulerConfigUpdate(buf []byte, index uint64) interfac } defer metrics.MeasureSince([]string{"nomad", "fsm", "apply_scheduler_config"}, time.Now()) + req.Config.Canonicalize() + if req.CAS { applied, err := n.state.SchedulerCASConfig(index, req.Config.ModifyIndex, &req.Config) if err != nil { @@ -1417,6 +1419,7 @@ func (n *nomadFSM) Restore(old io.ReadCloser) error { if err := dec.Decode(schedConfig); err != nil { return err } + schedConfig.Canonicalize() if err := restore.SchedulerConfigRestore(schedConfig); err != nil { return err } diff --git a/nomad/fsm_test.go b/nomad/fsm_test.go index f8bbcd752..0682143b6 100644 --- a/nomad/fsm_test.go +++ b/nomad/fsm_test.go @@ -2823,6 +2823,7 @@ func TestFSM_SnapshotRestore_SchedulerConfiguration(t *testing.T) { fsm := testFSM(t) state := fsm.State() schedConfig := &structs.SchedulerConfiguration{ + SchedulerAlgorithm: "spread", PreemptionConfig: structs.PreemptionConfig{ SystemSchedulerEnabled: true, }, diff --git a/nomad/structs/operator.go b/nomad/structs/operator.go index 38d181176..0a250ec2c 100644 --- a/nomad/structs/operator.go +++ b/nomad/structs/operator.go @@ -162,6 +162,12 @@ func (s *SchedulerConfiguration) EffectiveSchedulerAlgorithm() SchedulerAlgorith return s.SchedulerAlgorithm } +func (s *SchedulerConfiguration) Canonicalize() { + if s != nil && s.SchedulerAlgorithm == "" { + s.SchedulerAlgorithm = SchedulerAlgorithmBinpack + } +} + func (s *SchedulerConfiguration) Validate() error { if s == nil { return nil