Skip to content

Commit e92a6a2

Browse files
committed
Inform compatible extensions of enabled feature gates and API groups
1 parent 89c53ef commit e92a6a2

File tree

3 files changed

+118
-9
lines changed

3 files changed

+118
-9
lines changed

pkg/test/extensions/binary.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func (b *TestBinary) ListTests(ctx context.Context, envFlags EnvironmentFlags) (
106106
binLogger.Infof("OTE API version is: %s", b.info.APIVersion)
107107
envFlags = b.filterToApplicableEnvironmentFlags(envFlags)
108108
command := exec.Command(b.binaryPath, "list", "-o", "jsonl")
109-
binLogger.Infof("adding the following applicable flags to the list command: %s", envFlags.String())
109+
binLogger.Infof("Adding the following applicable flags to the list command: %s", envFlags.String())
110110
command.Args = append(command.Args, envFlags.ArgStrings()...)
111111
testList, err := runWithTimeout(ctx, command, 10*time.Minute)
112112
if err != nil {

pkg/test/extensions/types.go

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import (
55
"strings"
66
"time"
77

8-
"k8s.io/apimachinery/pkg/util/sets"
9-
108
configv1 "github.com/openshift/api/config/v1"
9+
"github.com/sirupsen/logrus"
10+
"k8s.io/apimachinery/pkg/util/sets"
1111
)
1212

1313
// ExtensionInfo represents an extension to openshift-tests.
@@ -199,12 +199,27 @@ const (
199199
optionalCapability EnvironmentFlagName = "optional-capability"
200200
fact EnvironmentFlagName = "fact"
201201
version EnvironmentFlagName = "version"
202+
featureGate EnvironmentFlagName = "feature-gate"
203+
apiGroup EnvironmentFlagName = "api-group"
202204
)
203205

204206
type EnvironmentFlagsBuilder struct {
205207
flags EnvironmentFlags
206208
}
207209

210+
func (e *EnvironmentFlagsBuilder) AddAPIGroups(values ...string) *EnvironmentFlagsBuilder {
211+
for _, value := range values {
212+
e.flags = append(e.flags, newEnvironmentFlag(apiGroup, value))
213+
}
214+
return e
215+
}
216+
217+
func (e *EnvironmentFlagsBuilder) AddFeatureGates(values ...string) *EnvironmentFlagsBuilder {
218+
for _, value := range values {
219+
e.flags = append(e.flags, newEnvironmentFlag(featureGate, value))
220+
}
221+
return e
222+
}
208223
func (e *EnvironmentFlagsBuilder) AddPlatform(value string) *EnvironmentFlagsBuilder {
209224
e.flags = append(e.flags, newEnvironmentFlag(platform, value))
210225
return e
@@ -290,11 +305,28 @@ func (ef EnvironmentFlags) ArgStrings() []string {
290305
}
291306

292307
func (ef EnvironmentFlags) String() string {
293-
return strings.Join(ef.ArgStrings(), ", ")
308+
return strings.Join(ef.ArgStrings(), " ")
309+
}
310+
311+
func (ef EnvironmentFlags) LogFields() logrus.Fields {
312+
fields := logrus.Fields{}
313+
314+
for _, flag := range ef {
315+
name := string(flag.Name)
316+
if val, ok := fields[name]; ok {
317+
fields[name] = append(val.([]string), flag.Value)
318+
} else {
319+
fields[name] = []string{flag.Value}
320+
}
321+
}
322+
323+
return fields
294324
}
295325

296326
// EnvironmentFlagVersions holds the "Since" version metadata for each flag.
297327
var EnvironmentFlagVersions = map[EnvironmentFlagName]string{
328+
featureGate: "v1.1",
329+
apiGroup: "v1.1",
298330
platform: "v1.0",
299331
network: "v1.0",
300332
networkStack: "v1.0",

pkg/test/ginkgo/cmd_runsuite.go

Lines changed: 82 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@ import (
1919

2020
"github.com/onsi/ginkgo/v2"
2121
configv1 "github.com/openshift/api/config/v1"
22+
clientconfigv1 "github.com/openshift/client-go/config/clientset/versioned"
23+
"github.com/pkg/errors"
2224
"github.com/sirupsen/logrus"
2325
"github.com/spf13/pflag"
2426
"golang.org/x/mod/semver"
27+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2528
"k8s.io/apimachinery/pkg/util/sets"
2629
"k8s.io/cli-runtime/pkg/genericclioptions"
2730
"k8s.io/client-go/discovery"
@@ -30,6 +33,7 @@ import (
3033

3134
"github.com/openshift/origin/pkg/clioptions/clusterdiscovery"
3235
"github.com/openshift/origin/pkg/clioptions/clusterinfo"
36+
"github.com/openshift/origin/pkg/clioptions/kubeconfig"
3337
"github.com/openshift/origin/pkg/defaultmonitortests"
3438
"github.com/openshift/origin/pkg/monitor"
3539
monitorserialization "github.com/openshift/origin/pkg/monitor/serialization"
@@ -192,11 +196,11 @@ func (o *GinkgoRunSuiteOptions) Run(suite *TestSuite, junitSuiteName string, mon
192196
listContext, listContextCancel := context.WithTimeout(context.Background(), 10*time.Minute)
193197
defer listContextCancel()
194198

195-
envFlags, err := determineEnvironmentFlags(upgrade, o.DryRun)
199+
envFlags, err := determineEnvironmentFlags(ctx, upgrade, o.DryRun)
196200
if err != nil {
197201
return fmt.Errorf("could not determine environment flags: %w", err)
198202
}
199-
logrus.WithField("flags", envFlags.String()).Infof("Determined all potential environment flags")
203+
logrus.WithFields(envFlags.LogFields()).Infof("Determined all potential environment flags")
200204

201205
externalTestSpecs, err := externalBinaries.ListTests(listContext, defaultBinaryParallelism, envFlags)
202206
if err != nil {
@@ -753,13 +757,13 @@ outerLoop:
753757
return matches, nil
754758
}
755759

756-
func determineEnvironmentFlags(upgrade bool, dryRun bool) (extensions.EnvironmentFlags, error) {
757-
clientConfig, err := e2e.LoadConfig(true)
760+
func determineEnvironmentFlags(ctx context.Context, upgrade bool, dryRun bool) (extensions.EnvironmentFlags, error) {
761+
restConfig, err := e2e.LoadConfig(true)
758762
if err != nil {
759763
logrus.WithError(err).Error("error calling e2e.LoadConfig")
760764
return nil, err
761765
}
762-
clusterState, err := clusterdiscovery.DiscoverClusterState(clientConfig)
766+
clusterState, err := clusterdiscovery.DiscoverClusterState(restConfig)
763767
if err != nil {
764768
logrus.WithError(err).Warn("error Discovering Cluster State, flags requiring it will not be present")
765769
}
@@ -780,6 +784,27 @@ func determineEnvironmentFlags(upgrade bool, dryRun bool) (extensions.Environmen
780784
AddNetworkStack(config.IPFamily).
781785
AddExternalConnectivity(determineExternalConnectivity(config))
782786

787+
clientConfig, err := clientconfigv1.NewForConfig(restConfig)
788+
if err != nil {
789+
return nil, err
790+
}
791+
792+
featureGates, err := determineEnabledFeatureGates(ctx, clientConfig)
793+
if err != nil {
794+
return nil, errors.WithMessage(err, "couldn't determine feature gates")
795+
}
796+
envFlagBuilder.AddFeatureGates(featureGates...)
797+
798+
discoveryClient, err := kubeconfig.NewDiscoveryGetter(restConfig).GetDiscoveryClient()
799+
if err != nil {
800+
return nil, err
801+
}
802+
apiGroups, err := determineEnabledAPIGroups(discoveryClient)
803+
if err != nil {
804+
return nil, errors.WithMessage(err, "couldn't determine api groups")
805+
}
806+
envFlagBuilder.AddAPIGroups(apiGroups...)
807+
783808
//Additional flags can only be determined if we are able to obtain the clusterState
784809
if clusterState != nil {
785810
upgradeType := "None"
@@ -836,3 +861,55 @@ func determineExternalConnectivity(clusterConfig *clusterdiscovery.ClusterConfig
836861
}
837862
return "Direct"
838863
}
864+
865+
func determineEnabledAPIGroups(discoveryClient discovery.AggregatedDiscoveryInterface) ([]string, error) {
866+
groups, err := discoveryClient.ServerGroups()
867+
if err != nil {
868+
return nil, fmt.Errorf("unable to retrieve served resources: %v", err)
869+
}
870+
apiGroups := sets.NewString()
871+
for _, apiGroup := range groups.Groups {
872+
// ignore the empty group
873+
if apiGroup.Name == "" {
874+
continue
875+
}
876+
apiGroups.Insert(apiGroup.Name)
877+
}
878+
879+
return apiGroups.List(), nil
880+
}
881+
882+
func determineEnabledFeatureGates(ctx context.Context, configClient clientconfigv1.Interface) ([]string, error) {
883+
featureGate, err := configClient.ConfigV1().FeatureGates().Get(ctx, "cluster", metav1.GetOptions{})
884+
if err != nil {
885+
return nil, err
886+
}
887+
clusterVersion, err := configClient.ConfigV1().ClusterVersions().Get(ctx, "version", metav1.GetOptions{})
888+
if err != nil {
889+
return nil, err
890+
}
891+
892+
desiredVersion := clusterVersion.Status.Desired.Version
893+
if len(desiredVersion) == 0 && len(clusterVersion.Status.History) > 0 {
894+
desiredVersion = clusterVersion.Status.History[0].Version
895+
}
896+
897+
ret := sets.NewString()
898+
found := false
899+
for _, featureGateValues := range featureGate.Status.FeatureGates {
900+
if featureGateValues.Version != desiredVersion {
901+
continue
902+
}
903+
found = true
904+
for _, enabled := range featureGateValues.Enabled {
905+
ret.Insert(string(enabled.Name))
906+
}
907+
break
908+
}
909+
if !found {
910+
logrus.Warning("no feature gates found")
911+
return nil, nil
912+
}
913+
914+
return ret.List(), nil
915+
}

0 commit comments

Comments
 (0)