@@ -3,6 +3,7 @@ package upgrade
33import (
44 "context"
55 "fmt"
6+ "reflect"
67
78 appsv1 "github.com/openshift/api/apps/v1"
89 routev1 "github.com/openshift/api/route/v1"
@@ -284,16 +285,37 @@ func transferDeploymentConfigVolumes(dc *appsv1.DeploymentConfig, deployment *k8
284285 volumesAdded := false
285286
286287 // Map to store volume names present in deployment
287- dVolumes := make (map [string ]bool )
288+ dVolumes := make (map [string ]corev1. Volume )
288289 for _ , dVolume := range deployment .Spec .Template .Spec .Volumes {
289- dVolumes [dVolume .Name ] = true
290+ dVolumes [dVolume .Name ] = dVolume
290291 }
291292
292293 // Determine which volumes exist in dc but not in deployment
293294 missingVolumes := make ([]corev1.Volume , 0 )
295+ missingItems := make (map [string ][]corev1.KeyToPath )
294296 for _ , dcVolume := range dc .Spec .Template .Spec .Volumes {
295- if _ , exists := dVolumes [dcVolume .Name ]; ! exists {
297+ if existingVolume , exists := dVolumes [dcVolume .Name ]; ! exists {
296298 missingVolumes = append (missingVolumes , dcVolume )
299+ } else {
300+ // If the volume is using a ConfigMap, check that the existing volume has all the same items as the dcVolume
301+ if existingVolume .ConfigMap != nil && dcVolume .ConfigMap != nil {
302+ if ! reflect .DeepEqual (existingVolume .ConfigMap , dcVolume .ConfigMap ) {
303+ itemDifference := make ([]corev1.KeyToPath , 0 )
304+ for _ , dcItem := range dcVolume .ConfigMap .Items {
305+ itemFound := false
306+ for _ , dItem := range existingVolume .ConfigMap .Items {
307+ if dcItem .Key == dItem .Key {
308+ itemFound = true
309+ break
310+ }
311+ }
312+ if ! itemFound {
313+ itemDifference = append (itemDifference , dcItem )
314+ }
315+ }
316+ missingItems [existingVolume .Name ] = itemDifference
317+ }
318+ }
297319 }
298320 }
299321
@@ -306,6 +328,19 @@ func transferDeploymentConfigVolumes(dc *appsv1.DeploymentConfig, deployment *k8
306328 volumesAdded = true
307329 }
308330
331+ // Add missing items to existing volumes in the Deployment
332+ if len (missingItems ) > 0 {
333+ for i , v := range deployment .Spec .Template .Spec .Volumes {
334+ if items , exists := missingItems [v .Name ]; exists {
335+ if deployment .Spec .Template .Spec .Volumes [i ].ConfigMap .Items == nil {
336+ deployment .Spec .Template .Spec .Volumes [i ].ConfigMap .Items = make ([]corev1.KeyToPath , 0 )
337+ }
338+ deployment .Spec .Template .Spec .Volumes [i ].ConfigMap .Items = append (items , v .ConfigMap .Items ... )
339+ }
340+ }
341+ volumesAdded = true
342+ }
343+
309344 // Loop through each container in dc to check for missing volume mounts
310345 for _ , dcContainer := range dc .Spec .Template .Spec .Containers {
311346 // Find corresponding container in deployment
0 commit comments