@@ -3,15 +3,16 @@ package capability
33import (
44 "fmt"
55 "reflect"
6- "sort"
6+
7+ "k8s.io/apimachinery/pkg/util/sets"
78
89 configv1 "github.com/openshift/api/config/v1"
910)
1011
1112type ClusterCapabilities struct {
12- Known map [configv1.ClusterVersionCapability ]struct {}
13- Enabled map [configv1.ClusterVersionCapability ]struct {}
14- ImplicitlyEnabled [] configv1.ClusterVersionCapability
13+ Known sets. Set [configv1.ClusterVersionCapability ]
14+ Enabled sets. Set [configv1.ClusterVersionCapability ]
15+ ImplicitlyEnabled sets. Set [ configv1.ClusterVersionCapability ]
1516}
1617
1718func (c * ClusterCapabilities ) Equal (capabilities * ClusterCapabilities ) error {
@@ -22,11 +23,14 @@ func (c *ClusterCapabilities) Equal(capabilities *ClusterCapabilities) error {
2223 return nil
2324}
2425
25- type capabilitiesSort []configv1.ClusterVersionCapability
26-
27- func (caps capabilitiesSort ) Len () int { return len (caps ) }
28- func (caps capabilitiesSort ) Swap (i , j int ) { caps [i ], caps [j ] = caps [j ], caps [i ] }
29- func (caps capabilitiesSort ) Less (i , j int ) bool { return string (caps [i ]) < string (caps [j ]) }
26+ // SortedList returns the slice with contents in sorted order for a given set of configv1.ClusterVersionCapability.
27+ // It returns nil if the give set is nil.
28+ func SortedList (s sets.Set [configv1.ClusterVersionCapability ]) []configv1.ClusterVersionCapability {
29+ if s == nil {
30+ return nil
31+ }
32+ return sets .List (s )
33+ }
3034
3135// SetCapabilities populates and returns cluster capabilities from ClusterVersion's capabilities specification and a
3236// collection of capabilities that are enabled including implicitly enabled.
@@ -36,7 +40,7 @@ func SetCapabilities(config *configv1.ClusterVersion,
3640 capabilities []configv1.ClusterVersionCapability ) ClusterCapabilities {
3741
3842 var clusterCapabilities ClusterCapabilities
39- clusterCapabilities .Known = GetCapabilitiesAsMap (configv1 .KnownClusterVersionCapabilities )
43+ clusterCapabilities .Known = sets . New [configv1. ClusterVersionCapability ] (configv1 .KnownClusterVersionCapabilities ... )
4044
4145 clusterCapabilities .Enabled , clusterCapabilities .ImplicitlyEnabled =
4246 categorizeEnabledCapabilities (config .Spec .Capabilities , capabilities )
@@ -59,7 +63,12 @@ func GetCapabilitiesAsMap(capabilities []configv1.ClusterVersionCapability) map[
5963func SetFromImplicitlyEnabledCapabilities (implicitlyEnabled []configv1.ClusterVersionCapability ,
6064 capabilities ClusterCapabilities ) ClusterCapabilities {
6165
62- capabilities .ImplicitlyEnabled = implicitlyEnabled
66+ if implicitlyEnabled == nil {
67+ capabilities .ImplicitlyEnabled = nil
68+ } else {
69+ capabilities .ImplicitlyEnabled = sets .New [configv1.ClusterVersionCapability ](implicitlyEnabled ... )
70+ }
71+
6372 for _ , c := range implicitlyEnabled {
6473 if _ , ok := capabilities .Enabled [c ]; ! ok {
6574 capabilities .Enabled [c ] = struct {}{}
@@ -71,79 +80,50 @@ func SetFromImplicitlyEnabledCapabilities(implicitlyEnabled []configv1.ClusterVe
7180// GetCapabilitiesStatus populates and returns ClusterVersion capabilities status from given capabilities.
7281func GetCapabilitiesStatus (capabilities ClusterCapabilities ) configv1.ClusterVersionCapabilitiesStatus {
7382 var status configv1.ClusterVersionCapabilitiesStatus
74- for k := range capabilities .Enabled {
75- status .EnabledCapabilities = append (status .EnabledCapabilities , k )
76- }
77- sort .Sort (capabilitiesSort (status .EnabledCapabilities ))
78- for k := range capabilities .Known {
79- status .KnownCapabilities = append (status .KnownCapabilities , k )
80- }
81- sort .Sort (capabilitiesSort (status .KnownCapabilities ))
83+ status .EnabledCapabilities = SortedList (capabilities .Enabled )
84+ status .KnownCapabilities = SortedList (capabilities .Known )
8285 return status
8386}
8487
8588// GetImplicitlyEnabledCapabilities, given an enabled resource's current capabilities, compares them against
8689// the resource's capabilities from an update release. Any of the updated resource's capabilities that do not
87- // exist in the current resource, are not enabled, and do not already exist in the implicitly enabled list of
88- // capabilities are returned. The returned list are capabilities which must be implicitly enabled.
89- func GetImplicitlyEnabledCapabilities (enabledManifestCaps []configv1.ClusterVersionCapability ,
90- updatedManifestCaps []configv1.ClusterVersionCapability ,
91- capabilities ClusterCapabilities ) []configv1.ClusterVersionCapability {
92-
93- var caps []configv1.ClusterVersionCapability
94- for _ , c := range updatedManifestCaps {
95- if Contains (enabledManifestCaps , c ) {
96- continue
97- }
98- if _ , ok := capabilities .Enabled [c ]; ! ok {
99- if ! Contains (capabilities .ImplicitlyEnabled , c ) {
100- caps = append (caps , c )
101- }
102- }
90+ // exist in the current resource, are not enabled, and do not already exist in the implicitly enabled capabilities
91+ // are returned. The returned capabilities must be implicitly enabled.
92+ func GetImplicitlyEnabledCapabilities (enabledManifestCaps sets.Set [configv1.ClusterVersionCapability ],
93+ updatedManifestCaps sets.Set [configv1.ClusterVersionCapability ],
94+ capabilities ClusterCapabilities ) sets.Set [configv1.ClusterVersionCapability ] {
95+ caps := updatedManifestCaps .Difference (enabledManifestCaps ).Difference (capabilities .Enabled ).Difference (capabilities .ImplicitlyEnabled )
96+ if caps .Len () == 0 {
97+ return nil
10398 }
104- sort .Sort (capabilitiesSort (caps ))
10599 return caps
106100}
107101
108- func Contains (caps []configv1.ClusterVersionCapability , capability configv1.ClusterVersionCapability ) bool {
109- found := false
110- for _ , c := range caps {
111- if capability == c {
112- found = true
113- break
114- }
115- }
116- return found
117- }
118-
119102// categorizeEnabledCapabilities categorizes enabled capabilities by implicitness from cluster version's
120103// capabilities specification and a collection of capabilities that are enabled including implicitly enabled.
121104func categorizeEnabledCapabilities (capabilitiesSpec * configv1.ClusterVersionCapabilitiesSpec ,
122- capabilities []configv1.ClusterVersionCapability ) (map [configv1.ClusterVersionCapability ]struct {} ,
123- [] configv1.ClusterVersionCapability ) {
105+ capabilities []configv1.ClusterVersionCapability ) (sets. Set [configv1.ClusterVersionCapability ],
106+ sets. Set [ configv1.ClusterVersionCapability ] ) {
124107
125108 capSet := configv1 .ClusterVersionCapabilitySetCurrent
126109
127110 if capabilitiesSpec != nil && len (capabilitiesSpec .BaselineCapabilitySet ) > 0 {
128111 capSet = capabilitiesSpec .BaselineCapabilitySet
129112 }
130- enabled := GetCapabilitiesAsMap (configv1 .ClusterVersionCapabilitySets [capSet ])
113+ enabled := sets . New [configv1. ClusterVersionCapability ] (configv1 .ClusterVersionCapabilitySets [capSet ]... )
131114
132115 if capabilitiesSpec != nil {
133- for _ , v := range capabilitiesSpec .AdditionalEnabledCapabilities {
134- if _ , ok := enabled [v ]; ok {
135- continue
136- }
137- enabled [v ] = struct {}{}
138- }
116+ enabled .Insert (capabilitiesSpec .AdditionalEnabledCapabilities ... )
139117 }
140- var implicitlyEnabled [] configv1.ClusterVersionCapability
118+ implicitlyEnabled := sets . New [ configv1.ClusterVersionCapability ]()
141119 for _ , k := range capabilities {
142- if _ , ok := enabled [ k ]; ! ok {
143- implicitlyEnabled = append ( implicitlyEnabled , k )
144- enabled [ k ] = struct {}{}
120+ if ! enabled . Has ( k ) {
121+ implicitlyEnabled . Insert ( k )
122+ enabled . Insert ( k )
145123 }
146124 }
147- sort .Sort (capabilitiesSort (implicitlyEnabled ))
125+ if implicitlyEnabled .Len () == 0 {
126+ implicitlyEnabled = nil
127+ }
148128 return enabled , implicitlyEnabled
149129}
0 commit comments