@@ -3,15 +3,16 @@ package capability
3
3
import (
4
4
"fmt"
5
5
"reflect"
6
- "sort"
6
+
7
+ "k8s.io/apimachinery/pkg/util/sets"
7
8
8
9
configv1 "github.com/openshift/api/config/v1"
9
10
)
10
11
11
12
type 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 ]
15
16
}
16
17
17
18
func (c * ClusterCapabilities ) Equal (capabilities * ClusterCapabilities ) error {
@@ -22,11 +23,14 @@ func (c *ClusterCapabilities) Equal(capabilities *ClusterCapabilities) error {
22
23
return nil
23
24
}
24
25
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
+ }
30
34
31
35
// SetCapabilities populates and returns cluster capabilities from ClusterVersion's capabilities specification and a
32
36
// collection of capabilities that are enabled including implicitly enabled.
@@ -36,7 +40,7 @@ func SetCapabilities(config *configv1.ClusterVersion,
36
40
capabilities []configv1.ClusterVersionCapability ) ClusterCapabilities {
37
41
38
42
var clusterCapabilities ClusterCapabilities
39
- clusterCapabilities .Known = GetCapabilitiesAsMap (configv1 .KnownClusterVersionCapabilities )
43
+ clusterCapabilities .Known = sets . New [configv1. ClusterVersionCapability ] (configv1 .KnownClusterVersionCapabilities ... )
40
44
41
45
clusterCapabilities .Enabled , clusterCapabilities .ImplicitlyEnabled =
42
46
categorizeEnabledCapabilities (config .Spec .Capabilities , capabilities )
@@ -59,7 +63,12 @@ func GetCapabilitiesAsMap(capabilities []configv1.ClusterVersionCapability) map[
59
63
func SetFromImplicitlyEnabledCapabilities (implicitlyEnabled []configv1.ClusterVersionCapability ,
60
64
capabilities ClusterCapabilities ) ClusterCapabilities {
61
65
62
- capabilities .ImplicitlyEnabled = implicitlyEnabled
66
+ if implicitlyEnabled == nil {
67
+ capabilities .ImplicitlyEnabled = nil
68
+ } else {
69
+ capabilities .ImplicitlyEnabled = sets .New [configv1.ClusterVersionCapability ](implicitlyEnabled ... )
70
+ }
71
+
63
72
for _ , c := range implicitlyEnabled {
64
73
if _ , ok := capabilities .Enabled [c ]; ! ok {
65
74
capabilities .Enabled [c ] = struct {}{}
@@ -71,79 +80,50 @@ func SetFromImplicitlyEnabledCapabilities(implicitlyEnabled []configv1.ClusterVe
71
80
// GetCapabilitiesStatus populates and returns ClusterVersion capabilities status from given capabilities.
72
81
func GetCapabilitiesStatus (capabilities ClusterCapabilities ) configv1.ClusterVersionCapabilitiesStatus {
73
82
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 )
82
85
return status
83
86
}
84
87
85
88
// GetImplicitlyEnabledCapabilities, given an enabled resource's current capabilities, compares them against
86
89
// 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
103
98
}
104
- sort .Sort (capabilitiesSort (caps ))
105
99
return caps
106
100
}
107
101
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
-
119
102
// categorizeEnabledCapabilities categorizes enabled capabilities by implicitness from cluster version's
120
103
// capabilities specification and a collection of capabilities that are enabled including implicitly enabled.
121
104
func 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 ] ) {
124
107
125
108
capSet := configv1 .ClusterVersionCapabilitySetCurrent
126
109
127
110
if capabilitiesSpec != nil && len (capabilitiesSpec .BaselineCapabilitySet ) > 0 {
128
111
capSet = capabilitiesSpec .BaselineCapabilitySet
129
112
}
130
- enabled := GetCapabilitiesAsMap (configv1 .ClusterVersionCapabilitySets [capSet ])
113
+ enabled := sets . New [configv1. ClusterVersionCapability ] (configv1 .ClusterVersionCapabilitySets [capSet ]... )
131
114
132
115
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 ... )
139
117
}
140
- var implicitlyEnabled [] configv1.ClusterVersionCapability
118
+ implicitlyEnabled := sets . New [ configv1.ClusterVersionCapability ]()
141
119
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 )
145
123
}
146
124
}
147
- sort .Sort (capabilitiesSort (implicitlyEnabled ))
125
+ if implicitlyEnabled .Len () == 0 {
126
+ implicitlyEnabled = nil
127
+ }
148
128
return enabled , implicitlyEnabled
149
129
}
0 commit comments