scheduler: volume updates should always be destructive (#13008)

This commit is contained in:
Tim Gross 2022-05-13 11:34:04 -04:00 committed by GitHub
parent 4ae15399bd
commit faeb3fcd44
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 0 deletions

3
.changelog/13008.txt Normal file
View File

@ -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
```

View File

@ -524,6 +524,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)
@ -554,6 +560,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(

View File

@ -811,6 +811,32 @@ func TestTasksUpdated(t *testing.T) {
// Compare changed Template wait configs
j23.TaskGroups[0].Tasks[0].Templates[0].Wait.Max = helper.TimeToPtr(10 * time.Second)
require.True(t, tasksUpdated(j22, j23, 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) {