diff --git a/.changelog/13008.txt b/.changelog/13008.txt new file mode 100644 index 000000000000..b12e5294bc94 --- /dev/null +++ b/.changelog/13008.txt @@ -0,0 +1,3 @@ +```release-note:bug +volumes: Fixed a bug where additions, updates, or removals of host volumes or CSI volumes were not treated as destructive updates +``` diff --git a/scheduler/util.go b/scheduler/util.go index 1223838d00e4..221e0a105373 100644 --- a/scheduler/util.go +++ b/scheduler/util.go @@ -382,6 +382,12 @@ func tasksUpdated(jobA, jobB *structs.Job, taskGroup string) bool { return true } + // Check if volumes are updated (no task driver can support + // altering mounts in-place) + if !reflect.DeepEqual(a.Volumes, b.Volumes) { + return true + } + // Check each task for _, at := range a.Tasks { bt := b.LookupTask(at.Name) @@ -412,6 +418,9 @@ func tasksUpdated(jobA, jobB *structs.Job, taskGroup string) bool { if !reflect.DeepEqual(at.CSIPluginConfig, bt.CSIPluginConfig) { return true } + if !reflect.DeepEqual(at.VolumeMounts, bt.VolumeMounts) { + return true + } // Check the metadata if !reflect.DeepEqual( diff --git a/scheduler/util_test.go b/scheduler/util_test.go index 30469fc376d2..6a34c6c684cf 100644 --- a/scheduler/util_test.go +++ b/scheduler/util_test.go @@ -705,6 +705,31 @@ func TestTasksUpdated(t *testing.T) { j21.TaskGroups[0].Tasks[0].Resources.Cores = 4 require.True(t, tasksUpdated(j20, j21, name)) + // Add a volume + j24 := mock.Job() + j25 := j24.Copy() + j25.TaskGroups[0].Volumes = map[string]*structs.VolumeRequest{ + "myvolume": { + Name: "myvolume", + Type: "csi", + Source: "test-volume[0]", + }} + require.True(t, tasksUpdated(j24, j25, name)) + + // Alter a volume + j26 := j25.Copy() + j26.TaskGroups[0].Volumes["myvolume"].ReadOnly = true + require.True(t, tasksUpdated(j25, j26, name)) + + // Alter a CSI plugin + j27 := mock.Job() + j27.TaskGroups[0].Tasks[0].CSIPluginConfig = &structs.TaskCSIPluginConfig{ + ID: "myplugin", + Type: "node", + } + j28 := j27.Copy() + j28.TaskGroups[0].Tasks[0].CSIPluginConfig.Type = "monolith" + require.True(t, tasksUpdated(j27, j28, name)) } func TestTasksUpdated_connectServiceUpdated(t *testing.T) {