Skip to content

Commit

Permalink
scheduler: volume updates should always be destructive
Browse files Browse the repository at this point in the history
  • Loading branch information
tgross committed May 13, 2022
1 parent bab219a commit cbaed84
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .changelog/13008.txt
Original file line number Diff line number Diff line change
@@ -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
```
9 changes: 9 additions & 0 deletions scheduler/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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(
Expand Down
26 changes: 26 additions & 0 deletions scheduler/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit cbaed84

Please sign in to comment.