Skip to content

Commit 198fdab

Browse files
committed
NO-JIRA: Use k8s.sets for the fields of ClusterCapabilities
1 parent fecdb0c commit 198fdab

File tree

5 files changed

+171
-275
lines changed

5 files changed

+171
-275
lines changed

lib/capability/capability.go

Lines changed: 41 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ package capability
33
import (
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

1112
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]
1516
}
1617

1718
func (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[
5963
func 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.
7281
func 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.
121104
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]) {
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

Comments
 (0)