generated from kubernetes/kubernetes-template-project
-
Notifications
You must be signed in to change notification settings - Fork 528
/
Copy pathfeatures.go
92 lines (74 loc) · 2.99 KB
/
features.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
Copyright 2022 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package features
import "k8s.io/apimachinery/pkg/util/sets"
// -----------------------------------------------------------------------------
// Features - Types
// -----------------------------------------------------------------------------
// FeatureName is the type used to represent the name of a feature.
type FeatureName string
// FeatureChannel is the type used to represent the channel a feature belongs to.
type FeatureChannel string
const (
// FeatureChannelExperimental is used for experimental features.
FeatureChannelExperimental = "experimental"
// FeatureChannelStandard is used for standard features.
FeatureChannelStandard = "standard"
)
// Feature is a struct that represents a feature.
type Feature struct {
Name FeatureName
Channel FeatureChannel
}
// -----------------------------------------------------------------------------
// Features - Compilations
// -----------------------------------------------------------------------------
// AllFeatures contains all the supported features and can be used to run all
// conformance tests with `all-features` flag.
//
// NOTE: as new feature sets are added they should be inserted into this set.
var (
AllFeatures = sets.New[Feature]().
Insert(GatewayCoreFeatures.UnsortedList()...).
Insert(GatewayExtendedFeatures.UnsortedList()...).
Insert(ReferenceGrantCoreFeatures.UnsortedList()...).
Insert(HTTPRouteCoreFeatures.UnsortedList()...).
Insert(HTTPRouteExtendedFeatures.UnsortedList()...).
Insert(TLSRouteCoreFeatures.UnsortedList()...).
Insert(MeshCoreFeatures.UnsortedList()...).
Insert(MeshExtendedFeatures.UnsortedList()...).
Insert(GRPCRouteCoreFeatures.UnsortedList()...)
featureMap = map[FeatureName]Feature{}
)
func init() {
for _, feature := range AllFeatures.UnsortedList() {
featureMap[feature.Name] = feature
}
}
// -----------------------------------------------------------------------------
// Features - Helpers
// -----------------------------------------------------------------------------
// SetsToNamesSet merges multiple sets of features into a single one and returns it.
func SetsToNamesSet(featuresSets ...sets.Set[Feature]) sets.Set[FeatureName] {
res := sets.Set[FeatureName]{}
for _, set := range featuresSets {
for _, feature := range set.UnsortedList() {
res.Insert(feature.Name)
}
}
return res
}
// GetFeature returns the feature with the given name.
func GetFeature(name FeatureName) Feature {
return featureMap[name]
}