66 "net/url"
77 "os"
88 "slices"
9+ "sort"
910 "strings"
1011
1112 // kube
@@ -17,6 +18,7 @@ import (
1718 "k8s.io/apimachinery/pkg/labels"
1819 "k8s.io/apimachinery/pkg/runtime/schema"
1920 "k8s.io/apimachinery/pkg/util/sets"
21+ "k8s.io/client-go/util/retry"
2022 "k8s.io/klog/v2"
2123
2224 // openshift
@@ -405,7 +407,15 @@ func (co *consoleOperator) SyncConfigMap(
405407 if err != nil {
406408 return nil , "FailedConsoleConfigBuilder" , err
407409 }
408- cm , cmChanged , cmErr := resourceapply .ApplyConfigMap (ctx , co .configMapClient , recorder , defaultConfigmap )
410+ var cm * corev1.ConfigMap
411+ var cmChanged bool
412+ var cmErr error
413+
414+ // Retry on conflicts to handle concurrent ConfigMap updates
415+ cmErr = retry .RetryOnConflict (retry .DefaultBackoff , func () error {
416+ cm , cmChanged , cmErr = resourceapply .ApplyConfigMap (ctx , co .configMapClient , recorder , defaultConfigmap )
417+ return cmErr
418+ })
409419 if cmErr != nil {
410420 return nil , "FailedApply" , cmErr
411421 }
@@ -731,6 +741,10 @@ func (co *consoleOperator) GetAvailablePlugins(enabledPluginsNames []string) []*
731741 }
732742 availablePlugins = append (availablePlugins , plugin )
733743 }
744+ // Sort plugins by name to ensure deterministic processing order
745+ sort .Slice (availablePlugins , func (i , j int ) bool {
746+ return availablePlugins [i ].Name < availablePlugins [j ].Name
747+ })
734748 return availablePlugins
735749}
736750
0 commit comments