From af676280312f06ab7c0d9cb421b23d76d4313742 Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Tue, 24 Jun 2025 16:22:13 -0700 Subject: [PATCH 01/20] Update inferred supported features report from bool to enum to account for exceptional case when only Mesh profile is being tested and no GWC available to determine supported features. --- conformance/apis/v1/conformancereport.go | 10 ++++++++- conformance/utils/suite/conformance.go | 6 ++++-- conformance/utils/suite/suite.go | 26 +++++++++++++++++++----- conformance/utils/suite/suite_test.go | 12 +++++++---- 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/conformance/apis/v1/conformancereport.go b/conformance/apis/v1/conformancereport.go index dcea92dffc..e025785904 100644 --- a/conformance/apis/v1/conformancereport.go +++ b/conformance/apis/v1/conformancereport.go @@ -53,9 +53,17 @@ type ConformanceReport struct { // InferredSupportedFeatures indicates whether the supported features were // automatically detected by the conformance suite. - InferredSupportedFeatures bool `json:"inferredSupportedFeatures"` + InferredSupportedFeatures InferredSupportedFeatures `json:"inferredSupportedFeatures"` } +type InferredSupportedFeatures int + +const ( + InferredSupportedFeaturesFalse InferredSupportedFeatures = iota + InferredSupportedFeaturesTrue + InferredSupportedFeaturesUnsupported +) + // Implementation provides metadata information on the downstream // implementation of Gateway API which ran conformance tests. type Implementation struct { diff --git a/conformance/utils/suite/conformance.go b/conformance/utils/suite/conformance.go index 12db14d6df..3bbbbc1c23 100644 --- a/conformance/utils/suite/conformance.go +++ b/conformance/utils/suite/conformance.go @@ -21,6 +21,8 @@ import ( "strings" "testing" + "k8s.io/apimachinery/pkg/util/sets" + "sigs.k8s.io/gateway-api/conformance/utils/tlog" "sigs.k8s.io/gateway-api/pkg/features" ) @@ -79,11 +81,11 @@ func (test *ConformanceTest) Run(t *testing.T, suite *ConformanceTestSuite) { // ParseSupportedFeatures parses flag arguments and converts the string to // sets.Set[features.FeatureName] -func ParseSupportedFeatures(f string) FeaturesSet { +func ParseSupportedFeatures(f string) sets.Set[features.FeatureName] { if f == "" { return nil } - res := FeaturesSet{} + res := sets.Set[features.FeatureName]{} for _, value := range strings.Split(f, ",") { res.Insert(features.FeatureName(value)) } diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index f1164fa2fe..cb00da47f5 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -84,7 +84,7 @@ type ConformanceTestSuite struct { // If SupportedFeatures are automatically determined from GWC Status. // This will be required to report in future iterations as the passing // will be determined based on this. - isInferredSupportedFeatures bool + isInferredSupportedFeatures confv1.InferredSupportedFeatures // mode is the operating mode of the implementation. // The default value for it is "default". @@ -179,6 +179,14 @@ type ConformanceOptions struct { ConformanceProfiles sets.Set[ConformanceProfileName] } +type FeatureDetectionStatus int + +const ( + FeatureDetectionStatusUnknown FeatureDetectionStatus = iota + FeatureDetectionStatusPass + FeatureDetectionStatusFail +) + type FeaturesSet = sets.Set[features.FeatureName] const ( @@ -191,21 +199,24 @@ const ( // NewConformanceTestSuite is a helper to use for creating a new ConformanceTestSuite. func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, error) { supportedFeatures := options.SupportedFeatures.Difference(options.ExemptFeatures) - isInferred := false + isInferred := confv1.InferredSupportedFeaturesFalse switch { case options.EnableAllSupportedFeatures: supportedFeatures = features.SetsToNamesSet(features.AllFeatures) + isInferred = confv1.InferredSupportedFeaturesFalse case shouldInferSupportedFeatures(&options): var err error supportedFeatures, err = fetchSupportedFeatures(options.Client, options.GatewayClassName) if err != nil { return nil, fmt.Errorf("Cannot infer supported features: %w", err) } - isInferred = true + isInferred = confv1.InferredSupportedFeaturesTrue + case isOnlyMeshProfile(): + isInferred = confv1.InferredSupportedFeaturesUnsupported } // If features were not inferred from Status, it's a GWC issue. - if isInferred && supportedFeatures.Len() == 0 { + if isInferred == confv1.InferredSupportedFeaturesTrue && supportedFeatures.Len() == 0 { return nil, fmt.Errorf("no supported features were determined for test suite") } @@ -394,7 +405,7 @@ func (suite *ConformanceTestSuite) Setup(t *testing.T, tests []ConformanceTest) } } -func (suite *ConformanceTestSuite) IsInferredSupportedFeatures() bool { +func (suite *ConformanceTestSuite) IsInferredSupportedFeatures() confv1.InferredSupportedFeatures { return suite.isInferredSupportedFeatures } @@ -645,3 +656,8 @@ func getAPIVersionAndChannel(crds []apiextensionsv1.CustomResourceDefinition) (v return version, channel, nil } + +// TODO(bexxmodd) - Add logic to determine if it's only Mesh profile. +func isOnlyMeshProfile() bool { + return false +} diff --git a/conformance/utils/suite/suite_test.go b/conformance/utils/suite/suite_test.go index ccb259adb0..39c14d05ee 100644 --- a/conformance/utils/suite/suite_test.go +++ b/conformance/utils/suite/suite_test.go @@ -280,7 +280,7 @@ func TestSuiteReport(t *testing.T) { coreProvisionalTest.ShortName, extendedProvisionalTest.ShortName, }, - InferredSupportedFeatures: true, + InferredSupportedFeatures: confv1.InferredSupportedFeaturesTrue, }, }, { @@ -390,7 +390,7 @@ func TestSuiteReport(t *testing.T) { }, }, }, - InferredSupportedFeatures: true, + InferredSupportedFeatures: confv1.InferredSupportedFeaturesTrue, }, }, } @@ -434,33 +434,37 @@ func TestInferSupportedFeatures(t *testing.T) { exemptFeatures FeaturesSet ConformanceProfile sets.Set[ConformanceProfileName] expectedFeatures FeaturesSet - expectedIsInferred bool + expectedIsInferred confv1.InferredSupportedFeatures }{ { name: "properly infer supported features", expectedFeatures: namesToFeatureSet(statusFeatureNames), - expectedIsInferred: true, + expectedIsInferred: confv1.InferredSupportedFeaturesTrue, }, { name: "no features", supportedFeatures: sets.New[features.FeatureName]("Gateway"), expectedFeatures: sets.New[features.FeatureName]("Gateway"), + expectedIsInferred: confv1.InferredSupportedFeaturesFalse, }, { name: "remove exempt features", supportedFeatures: sets.New[features.FeatureName]("Gateway", "HTTPRoute"), exemptFeatures: sets.New[features.FeatureName]("HTTPRoute"), expectedFeatures: sets.New[features.FeatureName]("Gateway"), + expectedIsInferred: confv1.InferredSupportedFeaturesFalse, }, { name: "allow all features", allowAllFeatures: true, expectedFeatures: features.SetsToNamesSet(features.AllFeatures), + expectedIsInferred: confv1.InferredSupportedFeaturesFalse, }, { name: "supports conformance profile - core", ConformanceProfile: sets.New(GatewayHTTPConformanceProfileName), expectedFeatures: namesToFeatureSet([]string{"Gateway", "HTTPRoute", "ReferenceGrant"}), + expectedIsInferred: confv1.InferredSupportedFeaturesFalse, }, } From 79ef1ab2c87342b13daca08792be23840916e127 Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Thu, 26 Jun 2025 21:35:55 -0700 Subject: [PATCH 02/20] Changed enum names. --- conformance/apis/v1/conformancereport.go | 12 +++---- conformance/utils/suite/suite.go | 36 +++++++++------------ conformance/utils/suite/suite_test.go | 40 ++++++++++++------------ 3 files changed, 40 insertions(+), 48 deletions(-) diff --git a/conformance/apis/v1/conformancereport.go b/conformance/apis/v1/conformancereport.go index e025785904..be56caf2cf 100644 --- a/conformance/apis/v1/conformancereport.go +++ b/conformance/apis/v1/conformancereport.go @@ -51,17 +51,17 @@ type ConformanceReport struct { // have been successfully run. SucceededProvisionalTests []string `json:"succeededProvisionalTests,omitempty"` - // InferredSupportedFeatures indicates whether the supported features were + // SupportedFeaturesSource indicates whether the supported features were // automatically detected by the conformance suite. - InferredSupportedFeatures InferredSupportedFeatures `json:"inferredSupportedFeatures"` + SupportedFeaturesSource SupportedFeaturesSource `json:"SupportedFeaturesSource"` } -type InferredSupportedFeatures int +type SupportedFeaturesSource int const ( - InferredSupportedFeaturesFalse InferredSupportedFeatures = iota - InferredSupportedFeaturesTrue - InferredSupportedFeaturesUnsupported + SupportedFeaturesSourceUndefined SupportedFeaturesSource = iota + SupportedFeaturesSourceManual + SupportedFeaturesSourceInferred ) // Implementation provides metadata information on the downstream diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index cb00da47f5..14f36dcb5d 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -84,7 +84,7 @@ type ConformanceTestSuite struct { // If SupportedFeatures are automatically determined from GWC Status. // This will be required to report in future iterations as the passing // will be determined based on this. - isInferredSupportedFeatures confv1.InferredSupportedFeatures + supportedFeaturesSource confv1.SupportedFeaturesSource // mode is the operating mode of the implementation. // The default value for it is "default". @@ -179,14 +179,6 @@ type ConformanceOptions struct { ConformanceProfiles sets.Set[ConformanceProfileName] } -type FeatureDetectionStatus int - -const ( - FeatureDetectionStatusUnknown FeatureDetectionStatus = iota - FeatureDetectionStatusPass - FeatureDetectionStatusFail -) - type FeaturesSet = sets.Set[features.FeatureName] const ( @@ -199,24 +191,23 @@ const ( // NewConformanceTestSuite is a helper to use for creating a new ConformanceTestSuite. func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, error) { supportedFeatures := options.SupportedFeatures.Difference(options.ExemptFeatures) - isInferred := confv1.InferredSupportedFeaturesFalse + status := confv1.SupportedFeaturesSourceManual switch { case options.EnableAllSupportedFeatures: supportedFeatures = features.SetsToNamesSet(features.AllFeatures) - isInferred = confv1.InferredSupportedFeaturesFalse case shouldInferSupportedFeatures(&options): var err error supportedFeatures, err = fetchSupportedFeatures(options.Client, options.GatewayClassName) if err != nil { return nil, fmt.Errorf("Cannot infer supported features: %w", err) } - isInferred = confv1.InferredSupportedFeaturesTrue - case isOnlyMeshProfile(): - isInferred = confv1.InferredSupportedFeaturesUnsupported + status = confv1.SupportedFeaturesSourceInferred + case isOnlyMeshProfile(&options): + status = confv1.SupportedFeaturesSourceUndefined } // If features were not inferred from Status, it's a GWC issue. - if isInferred == confv1.InferredSupportedFeaturesTrue && supportedFeatures.Len() == 0 { + if status == confv1.SupportedFeaturesSourceInferred && supportedFeatures.Len() == 0 { return nil, fmt.Errorf("no supported features were determined for test suite") } @@ -284,7 +275,7 @@ func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, mode: mode, apiVersion: apiVersion, apiChannel: apiChannel, - isInferredSupportedFeatures: isInferred, + supportedFeaturesSource: status, Hook: options.Hook, } @@ -298,6 +289,7 @@ func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, for _, f := range conformanceProfile.CoreFeatures.UnsortedList() { if !options.SupportedFeatures.Has(f) { suite.SupportedFeatures.Insert(f) + suite.supportedFeaturesSource = confv1.SupportedFeaturesSourceManual } } for _, f := range conformanceProfile.ExtendedFeatures.UnsortedList() { @@ -405,8 +397,8 @@ func (suite *ConformanceTestSuite) Setup(t *testing.T, tests []ConformanceTest) } } -func (suite *ConformanceTestSuite) IsInferredSupportedFeatures() confv1.InferredSupportedFeatures { - return suite.isInferredSupportedFeatures +func (suite *ConformanceTestSuite) SupportedFeaturesSource() confv1.SupportedFeaturesSource { + return suite.supportedFeaturesSource } func (suite *ConformanceTestSuite) setClientsetForTest(test ConformanceTest) error { @@ -563,7 +555,7 @@ func (suite *ConformanceTestSuite) Report() (*confv1.ConformanceReport, error) { GatewayAPIChannel: suite.apiChannel, ProfileReports: profileReports.list(), SucceededProvisionalTests: succeededProvisionalTests, - InferredSupportedFeatures: suite.IsInferredSupportedFeatures(), + SupportedFeaturesSource: suite.SupportedFeaturesSource(), }, nil } @@ -621,7 +613,6 @@ func shouldInferSupportedFeatures(opts *ConformanceOptions) bool { return !opts.EnableAllSupportedFeatures && opts.SupportedFeatures.Len() == 0 && opts.ExemptFeatures.Len() == 0 && - opts.ConformanceProfiles.Len() == 0 && len(opts.SkipTests) == 0 && opts.RunTest == "" } @@ -657,7 +648,8 @@ func getAPIVersionAndChannel(crds []apiextensionsv1.CustomResourceDefinition) (v return version, channel, nil } -// TODO(bexxmodd) - Add logic to determine if it's only Mesh profile. -func isOnlyMeshProfile() bool { +func isOnlyMeshProfile(options *ConformanceOptions) bool { + // TODO(bexxmodd): Currently a placeholder to add logic that determines if + // it's only Mesh profile without GWC. return false } diff --git a/conformance/utils/suite/suite_test.go b/conformance/utils/suite/suite_test.go index 39c14d05ee..9a8403ef52 100644 --- a/conformance/utils/suite/suite_test.go +++ b/conformance/utils/suite/suite_test.go @@ -280,7 +280,7 @@ func TestSuiteReport(t *testing.T) { coreProvisionalTest.ShortName, extendedProvisionalTest.ShortName, }, - InferredSupportedFeatures: confv1.InferredSupportedFeaturesTrue, + SupportedFeaturesSource: confv1.SupportedFeaturesSourceInferred, }, }, { @@ -390,7 +390,7 @@ func TestSuiteReport(t *testing.T) { }, }, }, - InferredSupportedFeatures: confv1.InferredSupportedFeaturesTrue, + SupportedFeaturesSource: confv1.SupportedFeaturesSourceInferred, }, }, } @@ -434,37 +434,37 @@ func TestInferSupportedFeatures(t *testing.T) { exemptFeatures FeaturesSet ConformanceProfile sets.Set[ConformanceProfileName] expectedFeatures FeaturesSet - expectedIsInferred confv1.InferredSupportedFeatures + expectedIsInferred confv1.SupportedFeaturesSource }{ { name: "properly infer supported features", expectedFeatures: namesToFeatureSet(statusFeatureNames), - expectedIsInferred: confv1.InferredSupportedFeaturesTrue, + expectedIsInferred: confv1.SupportedFeaturesSourceInferred, }, { - name: "no features", - supportedFeatures: sets.New[features.FeatureName]("Gateway"), - expectedFeatures: sets.New[features.FeatureName]("Gateway"), - expectedIsInferred: confv1.InferredSupportedFeaturesFalse, + name: "no features", + supportedFeatures: sets.New[features.FeatureName]("Gateway"), + expectedFeatures: sets.New[features.FeatureName]("Gateway"), + expectedIsInferred: confv1.SupportedFeaturesSourceManual, }, { - name: "remove exempt features", - supportedFeatures: sets.New[features.FeatureName]("Gateway", "HTTPRoute"), - exemptFeatures: sets.New[features.FeatureName]("HTTPRoute"), - expectedFeatures: sets.New[features.FeatureName]("Gateway"), - expectedIsInferred: confv1.InferredSupportedFeaturesFalse, + name: "remove exempt features", + supportedFeatures: sets.New[features.FeatureName]("Gateway", "HTTPRoute"), + exemptFeatures: sets.New[features.FeatureName]("HTTPRoute"), + expectedFeatures: sets.New[features.FeatureName]("Gateway"), + expectedIsInferred: confv1.SupportedFeaturesSourceManual, }, { - name: "allow all features", - allowAllFeatures: true, - expectedFeatures: features.SetsToNamesSet(features.AllFeatures), - expectedIsInferred: confv1.InferredSupportedFeaturesFalse, + name: "allow all features", + allowAllFeatures: true, + expectedFeatures: features.SetsToNamesSet(features.AllFeatures), + expectedIsInferred: confv1.SupportedFeaturesSourceManual, }, { name: "supports conformance profile - core", ConformanceProfile: sets.New(GatewayHTTPConformanceProfileName), expectedFeatures: namesToFeatureSet([]string{"Gateway", "HTTPRoute", "ReferenceGrant"}), - expectedIsInferred: confv1.InferredSupportedFeaturesFalse, + expectedIsInferred: confv1.SupportedFeaturesSourceManual, }, } @@ -516,8 +516,8 @@ func TestInferSupportedFeatures(t *testing.T) { t.Fatalf("error initializing conformance suite: %v", err) } - if cSuite.IsInferredSupportedFeatures() != tc.expectedIsInferred { - t.Errorf("InferredSupportedFeatures mismatch: got %v, want %v", cSuite.IsInferredSupportedFeatures(), tc.expectedIsInferred) + if cSuite.SupportedFeaturesSource() != tc.expectedIsInferred { + t.Errorf("InferredSupportedFeatures mismatch: got %v, want %v", cSuite.SupportedFeaturesSource(), tc.expectedIsInferred) } if equal := cSuite.SupportedFeatures.Equal(tc.expectedFeatures); !equal { From 8cb20549d959478e64c5bf2b4d2b7ac658302ac6 Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Thu, 26 Jun 2025 21:56:35 -0700 Subject: [PATCH 03/20] Added comment to report enum --- conformance/apis/v1/conformancereport.go | 3 +++ conformance/utils/suite/suite.go | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/conformance/apis/v1/conformancereport.go b/conformance/apis/v1/conformancereport.go index be56caf2cf..4b531d12bb 100644 --- a/conformance/apis/v1/conformancereport.go +++ b/conformance/apis/v1/conformancereport.go @@ -56,6 +56,9 @@ type ConformanceReport struct { SupportedFeaturesSource SupportedFeaturesSource `json:"SupportedFeaturesSource"` } +// SupportedFeaturesSource represents the source from which supported features are derived. +// It is used to distinguish between them being inferred from GWC Status or manually +// supplied for the conformance report. type SupportedFeaturesSource int const ( diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index 14f36dcb5d..0c8c829fac 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -648,8 +648,8 @@ func getAPIVersionAndChannel(crds []apiextensionsv1.CustomResourceDefinition) (v return version, channel, nil } -func isOnlyMeshProfile(options *ConformanceOptions) bool { - // TODO(bexxmodd): Currently a placeholder to add logic that determines if +func isOnlyMeshProfile(_ *ConformanceOptions) bool { + // TODO(bexxmodd): Currently a placeholder to add logic that determines if // it's only Mesh profile without GWC. return false } From dceb6f612f309713cf2570cee0cef06920de0b77 Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Thu, 26 Jun 2025 22:01:33 -0700 Subject: [PATCH 04/20] Revert change caused by merge. --- conformance/utils/suite/conformance.go | 4 ++-- conformance/utils/suite/suite.go | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/conformance/utils/suite/conformance.go b/conformance/utils/suite/conformance.go index 3bbbbc1c23..2191594de0 100644 --- a/conformance/utils/suite/conformance.go +++ b/conformance/utils/suite/conformance.go @@ -81,11 +81,11 @@ func (test *ConformanceTest) Run(t *testing.T, suite *ConformanceTestSuite) { // ParseSupportedFeatures parses flag arguments and converts the string to // sets.Set[features.FeatureName] -func ParseSupportedFeatures(f string) sets.Set[features.FeatureName] { +func ParseSupportedFeatures(f string) FeaturesSet { if f == "" { return nil } - res := sets.Set[features.FeatureName]{} + res := FeaturesSet{} for _, value := range strings.Split(f, ",") { res.Insert(features.FeatureName(value)) } diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index 0c8c829fac..795fca0af1 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -191,7 +191,7 @@ const ( // NewConformanceTestSuite is a helper to use for creating a new ConformanceTestSuite. func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, error) { supportedFeatures := options.SupportedFeatures.Difference(options.ExemptFeatures) - status := confv1.SupportedFeaturesSourceManual + source := confv1.SupportedFeaturesSourceManual switch { case options.EnableAllSupportedFeatures: supportedFeatures = features.SetsToNamesSet(features.AllFeatures) @@ -201,13 +201,13 @@ func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, if err != nil { return nil, fmt.Errorf("Cannot infer supported features: %w", err) } - status = confv1.SupportedFeaturesSourceInferred + source = confv1.SupportedFeaturesSourceInferred case isOnlyMeshProfile(&options): - status = confv1.SupportedFeaturesSourceUndefined + source = confv1.SupportedFeaturesSourceUndefined } // If features were not inferred from Status, it's a GWC issue. - if status == confv1.SupportedFeaturesSourceInferred && supportedFeatures.Len() == 0 { + if source == confv1.SupportedFeaturesSourceInferred && supportedFeatures.Len() == 0 { return nil, fmt.Errorf("no supported features were determined for test suite") } @@ -275,7 +275,7 @@ func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, mode: mode, apiVersion: apiVersion, apiChannel: apiChannel, - supportedFeaturesSource: status, + supportedFeaturesSource: source, Hook: options.Hook, } From 9166ef2310295674cd94c93700db69f8024903a2 Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Mon, 30 Jun 2025 08:30:44 -0700 Subject: [PATCH 05/20] Converted enums from int to string for better readability. --- conformance/apis/v1/conformancereport.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/conformance/apis/v1/conformancereport.go b/conformance/apis/v1/conformancereport.go index 4b531d12bb..c8a8e82943 100644 --- a/conformance/apis/v1/conformancereport.go +++ b/conformance/apis/v1/conformancereport.go @@ -53,18 +53,18 @@ type ConformanceReport struct { // SupportedFeaturesSource indicates whether the supported features were // automatically detected by the conformance suite. - SupportedFeaturesSource SupportedFeaturesSource `json:"SupportedFeaturesSource"` + SupportedFeaturesSource SupportedFeaturesSource `json:"supportedFeaturesSource"` } // SupportedFeaturesSource represents the source from which supported features are derived. // It is used to distinguish between them being inferred from GWC Status or manually // supplied for the conformance report. -type SupportedFeaturesSource int +type SupportedFeaturesSource string const ( - SupportedFeaturesSourceUndefined SupportedFeaturesSource = iota - SupportedFeaturesSourceManual - SupportedFeaturesSourceInferred + SupportedFeaturesSourceUndefined SupportedFeaturesSource = "Undefined" + SupportedFeaturesSourceManual SupportedFeaturesSource = "Manual" + SupportedFeaturesSourceInferred SupportedFeaturesSource = "Inferred" ) // Implementation provides metadata information on the downstream From ce0a0712d329324858efcfa361a161c8b32631bf Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Mon, 30 Jun 2025 08:32:15 -0700 Subject: [PATCH 06/20] Removed unused import. --- conformance/utils/suite/conformance.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/conformance/utils/suite/conformance.go b/conformance/utils/suite/conformance.go index 2191594de0..12db14d6df 100644 --- a/conformance/utils/suite/conformance.go +++ b/conformance/utils/suite/conformance.go @@ -21,8 +21,6 @@ import ( "strings" "testing" - "k8s.io/apimachinery/pkg/util/sets" - "sigs.k8s.io/gateway-api/conformance/utils/tlog" "sigs.k8s.io/gateway-api/pkg/features" ) From 8906f69ba8acbbf4ffb3125b310ec3e14e290976 Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Mon, 30 Jun 2025 09:16:11 -0700 Subject: [PATCH 07/20] Updated unit tests to reflect enum change to strings. --- conformance/apis/v1/conformancereport.go | 6 ++-- conformance/utils/suite/suite_test.go | 42 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/conformance/apis/v1/conformancereport.go b/conformance/apis/v1/conformancereport.go index c8a8e82943..00276f349f 100644 --- a/conformance/apis/v1/conformancereport.go +++ b/conformance/apis/v1/conformancereport.go @@ -59,12 +59,12 @@ type ConformanceReport struct { // SupportedFeaturesSource represents the source from which supported features are derived. // It is used to distinguish between them being inferred from GWC Status or manually // supplied for the conformance report. -type SupportedFeaturesSource string +type SupportedFeaturesSource string const ( SupportedFeaturesSourceUndefined SupportedFeaturesSource = "Undefined" - SupportedFeaturesSourceManual SupportedFeaturesSource = "Manual" - SupportedFeaturesSourceInferred SupportedFeaturesSource = "Inferred" + SupportedFeaturesSourceManual SupportedFeaturesSource = "Manual" + SupportedFeaturesSourceInferred SupportedFeaturesSource = "Inferred" ) // Implementation provides metadata information on the downstream diff --git a/conformance/utils/suite/suite_test.go b/conformance/utils/suite/suite_test.go index 9a8403ef52..95d8e6fbf9 100644 --- a/conformance/utils/suite/suite_test.go +++ b/conformance/utils/suite/suite_test.go @@ -434,37 +434,37 @@ func TestInferSupportedFeatures(t *testing.T) { exemptFeatures FeaturesSet ConformanceProfile sets.Set[ConformanceProfileName] expectedFeatures FeaturesSet - expectedIsInferred confv1.SupportedFeaturesSource + expectedSource confv1.SupportedFeaturesSource }{ { - name: "properly infer supported features", - expectedFeatures: namesToFeatureSet(statusFeatureNames), - expectedIsInferred: confv1.SupportedFeaturesSourceInferred, + name: "properly infer supported features", + expectedFeatures: namesToFeatureSet(statusFeatureNames), + expectedSource: confv1.SupportedFeaturesSourceInferred, }, { - name: "no features", - supportedFeatures: sets.New[features.FeatureName]("Gateway"), - expectedFeatures: sets.New[features.FeatureName]("Gateway"), - expectedIsInferred: confv1.SupportedFeaturesSourceManual, + name: "no features", + supportedFeatures: sets.New[features.FeatureName]("Gateway"), + expectedFeatures: sets.New[features.FeatureName]("Gateway"), + expectedSource: confv1.SupportedFeaturesSourceManual, }, { - name: "remove exempt features", - supportedFeatures: sets.New[features.FeatureName]("Gateway", "HTTPRoute"), - exemptFeatures: sets.New[features.FeatureName]("HTTPRoute"), - expectedFeatures: sets.New[features.FeatureName]("Gateway"), - expectedIsInferred: confv1.SupportedFeaturesSourceManual, + name: "remove exempt features", + supportedFeatures: sets.New[features.FeatureName]("Gateway", "HTTPRoute"), + exemptFeatures: sets.New[features.FeatureName]("HTTPRoute"), + expectedFeatures: sets.New[features.FeatureName]("Gateway"), + expectedSource: confv1.SupportedFeaturesSourceManual, }, { - name: "allow all features", - allowAllFeatures: true, - expectedFeatures: features.SetsToNamesSet(features.AllFeatures), - expectedIsInferred: confv1.SupportedFeaturesSourceManual, + name: "allow all features", + allowAllFeatures: true, + expectedFeatures: features.SetsToNamesSet(features.AllFeatures), + expectedSource: confv1.SupportedFeaturesSourceManual, }, { name: "supports conformance profile - core", ConformanceProfile: sets.New(GatewayHTTPConformanceProfileName), - expectedFeatures: namesToFeatureSet([]string{"Gateway", "HTTPRoute", "ReferenceGrant"}), - expectedIsInferred: confv1.SupportedFeaturesSourceManual, + expectedFeatures: namesToFeatureSet(statusFeatureNames), + expectedSource: confv1.SupportedFeaturesSourceManual, }, } @@ -516,8 +516,8 @@ func TestInferSupportedFeatures(t *testing.T) { t.Fatalf("error initializing conformance suite: %v", err) } - if cSuite.SupportedFeaturesSource() != tc.expectedIsInferred { - t.Errorf("InferredSupportedFeatures mismatch: got %v, want %v", cSuite.SupportedFeaturesSource(), tc.expectedIsInferred) + if cSuite.SupportedFeaturesSource() != tc.expectedSource { + t.Errorf("InferredSupportedFeatures mismatch: got %v, want %v", cSuite.SupportedFeaturesSource(), tc.expectedSource) } if equal := cSuite.SupportedFeatures.Equal(tc.expectedFeatures); !equal { From dc78f699b99dfff6bcc313a170051f11d5c93d3b Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Mon, 30 Jun 2025 20:23:07 -0700 Subject: [PATCH 08/20] Removed skip tests from determining if supported features are inferred or manually selected. --- conformance/utils/suite/suite.go | 1 - 1 file changed, 1 deletion(-) diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index 795fca0af1..d8a054044b 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -613,7 +613,6 @@ func shouldInferSupportedFeatures(opts *ConformanceOptions) bool { return !opts.EnableAllSupportedFeatures && opts.SupportedFeatures.Len() == 0 && opts.ExemptFeatures.Len() == 0 && - len(opts.SkipTests) == 0 && opts.RunTest == "" } From d0e004527d76de3af234fd9b8f6b24c4356305e1 Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Tue, 1 Jul 2025 06:58:10 -0700 Subject: [PATCH 09/20] Removed source update. --- conformance/utils/suite/suite.go | 1 - 1 file changed, 1 deletion(-) diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index d8a054044b..4ebb9c1f3c 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -289,7 +289,6 @@ func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, for _, f := range conformanceProfile.CoreFeatures.UnsortedList() { if !options.SupportedFeatures.Has(f) { suite.SupportedFeatures.Insert(f) - suite.supportedFeaturesSource = confv1.SupportedFeaturesSourceManual } } for _, f := range conformanceProfile.ExtendedFeatures.UnsortedList() { From 94e5b27b9278a40309f4f09905d839645e3ec30c Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Tue, 1 Jul 2025 07:10:45 -0700 Subject: [PATCH 10/20] Updated unit tests. --- conformance/utils/suite/suite_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conformance/utils/suite/suite_test.go b/conformance/utils/suite/suite_test.go index 95d8e6fbf9..5ea3c78b25 100644 --- a/conformance/utils/suite/suite_test.go +++ b/conformance/utils/suite/suite_test.go @@ -464,7 +464,7 @@ func TestInferSupportedFeatures(t *testing.T) { name: "supports conformance profile - core", ConformanceProfile: sets.New(GatewayHTTPConformanceProfileName), expectedFeatures: namesToFeatureSet(statusFeatureNames), - expectedSource: confv1.SupportedFeaturesSourceManual, + expectedSource: confv1.SupportedFeaturesSourceInferred, }, } From ce227ae82b9c403bed080e1e48075c11bbbc702d Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Thu, 3 Jul 2025 09:22:14 -0700 Subject: [PATCH 11/20] Removed source enum from report. --- conformance/apis/v1/conformancereport.go | 15 --------------- conformance/utils/suite/suite.go | 24 +++++++++++++++++------- conformance/utils/suite/suite_test.go | 14 ++++++-------- 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/conformance/apis/v1/conformancereport.go b/conformance/apis/v1/conformancereport.go index 00276f349f..7f4f4d5325 100644 --- a/conformance/apis/v1/conformancereport.go +++ b/conformance/apis/v1/conformancereport.go @@ -50,23 +50,8 @@ type ConformanceReport struct { // SucceededProvisionalTests is a list of the names of the provisional tests that // have been successfully run. SucceededProvisionalTests []string `json:"succeededProvisionalTests,omitempty"` - - // SupportedFeaturesSource indicates whether the supported features were - // automatically detected by the conformance suite. - SupportedFeaturesSource SupportedFeaturesSource `json:"supportedFeaturesSource"` } -// SupportedFeaturesSource represents the source from which supported features are derived. -// It is used to distinguish between them being inferred from GWC Status or manually -// supplied for the conformance report. -type SupportedFeaturesSource string - -const ( - SupportedFeaturesSourceUndefined SupportedFeaturesSource = "Undefined" - SupportedFeaturesSourceManual SupportedFeaturesSource = "Manual" - SupportedFeaturesSourceInferred SupportedFeaturesSource = "Inferred" -) - // Implementation provides metadata information on the downstream // implementation of Gateway API which ran conformance tests. type Implementation struct { diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index 4ebb9c1f3c..ab026cc2fa 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -84,7 +84,7 @@ type ConformanceTestSuite struct { // If SupportedFeatures are automatically determined from GWC Status. // This will be required to report in future iterations as the passing // will be determined based on this. - supportedFeaturesSource confv1.SupportedFeaturesSource + supportedFeaturesSource supportedFeaturesSource // mode is the operating mode of the implementation. // The default value for it is "default". @@ -188,10 +188,21 @@ const ( undefinedKeyword = "UNDEFINED" ) +// SupportedFeaturesSource represents the source from which supported features are derived. +// It is used to distinguish between them being inferred from GWC Status or manually +// supplied for the conformance report. +type supportedFeaturesSource string + +const ( + supportedFeaturesSourceUndefined supportedFeaturesSource = "Undefined" + supportedFeaturesSourceManual supportedFeaturesSource = "Manual" + supportedFeaturesSourceInferred supportedFeaturesSource = "Inferred" +) + // NewConformanceTestSuite is a helper to use for creating a new ConformanceTestSuite. func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, error) { supportedFeatures := options.SupportedFeatures.Difference(options.ExemptFeatures) - source := confv1.SupportedFeaturesSourceManual + source := supportedFeaturesSourceManual switch { case options.EnableAllSupportedFeatures: supportedFeatures = features.SetsToNamesSet(features.AllFeatures) @@ -201,13 +212,13 @@ func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, if err != nil { return nil, fmt.Errorf("Cannot infer supported features: %w", err) } - source = confv1.SupportedFeaturesSourceInferred + source = supportedFeaturesSourceInferred case isOnlyMeshProfile(&options): - source = confv1.SupportedFeaturesSourceUndefined + source = supportedFeaturesSourceUndefined } // If features were not inferred from Status, it's a GWC issue. - if source == confv1.SupportedFeaturesSourceInferred && supportedFeatures.Len() == 0 { + if source == supportedFeaturesSourceInferred && supportedFeatures.Len() == 0 { return nil, fmt.Errorf("no supported features were determined for test suite") } @@ -396,7 +407,7 @@ func (suite *ConformanceTestSuite) Setup(t *testing.T, tests []ConformanceTest) } } -func (suite *ConformanceTestSuite) SupportedFeaturesSource() confv1.SupportedFeaturesSource { +func (suite *ConformanceTestSuite) SupportedFeaturesSource() supportedFeaturesSource { return suite.supportedFeaturesSource } @@ -554,7 +565,6 @@ func (suite *ConformanceTestSuite) Report() (*confv1.ConformanceReport, error) { GatewayAPIChannel: suite.apiChannel, ProfileReports: profileReports.list(), SucceededProvisionalTests: succeededProvisionalTests, - SupportedFeaturesSource: suite.SupportedFeaturesSource(), }, nil } diff --git a/conformance/utils/suite/suite_test.go b/conformance/utils/suite/suite_test.go index 5ea3c78b25..06ec8a1aba 100644 --- a/conformance/utils/suite/suite_test.go +++ b/conformance/utils/suite/suite_test.go @@ -280,7 +280,6 @@ func TestSuiteReport(t *testing.T) { coreProvisionalTest.ShortName, extendedProvisionalTest.ShortName, }, - SupportedFeaturesSource: confv1.SupportedFeaturesSourceInferred, }, }, { @@ -390,7 +389,6 @@ func TestSuiteReport(t *testing.T) { }, }, }, - SupportedFeaturesSource: confv1.SupportedFeaturesSourceInferred, }, }, } @@ -434,37 +432,37 @@ func TestInferSupportedFeatures(t *testing.T) { exemptFeatures FeaturesSet ConformanceProfile sets.Set[ConformanceProfileName] expectedFeatures FeaturesSet - expectedSource confv1.SupportedFeaturesSource + expectedSource supportedFeaturesSource }{ { name: "properly infer supported features", expectedFeatures: namesToFeatureSet(statusFeatureNames), - expectedSource: confv1.SupportedFeaturesSourceInferred, + expectedSource: supportedFeaturesSourceInferred, }, { name: "no features", supportedFeatures: sets.New[features.FeatureName]("Gateway"), expectedFeatures: sets.New[features.FeatureName]("Gateway"), - expectedSource: confv1.SupportedFeaturesSourceManual, + expectedSource: supportedFeaturesSourceManual, }, { name: "remove exempt features", supportedFeatures: sets.New[features.FeatureName]("Gateway", "HTTPRoute"), exemptFeatures: sets.New[features.FeatureName]("HTTPRoute"), expectedFeatures: sets.New[features.FeatureName]("Gateway"), - expectedSource: confv1.SupportedFeaturesSourceManual, + expectedSource: supportedFeaturesSourceManual, }, { name: "allow all features", allowAllFeatures: true, expectedFeatures: features.SetsToNamesSet(features.AllFeatures), - expectedSource: confv1.SupportedFeaturesSourceManual, + expectedSource: supportedFeaturesSourceManual, }, { name: "supports conformance profile - core", ConformanceProfile: sets.New(GatewayHTTPConformanceProfileName), expectedFeatures: namesToFeatureSet(statusFeatureNames), - expectedSource: confv1.SupportedFeaturesSourceInferred, + expectedSource: supportedFeaturesSourceInferred, }, } From 44e7a5c3c5010c13b5563e272a987c61dd09c70a Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Thu, 3 Jul 2025 09:25:48 -0700 Subject: [PATCH 12/20] start error string with lowercase. --- conformance/utils/suite/suite.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index ab026cc2fa..ec726e56ab 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -210,7 +210,7 @@ func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, var err error supportedFeatures, err = fetchSupportedFeatures(options.Client, options.GatewayClassName) if err != nil { - return nil, fmt.Errorf("Cannot infer supported features: %w", err) + return nil, fmt.Errorf("cannot infer supported features: %w", err) } source = supportedFeaturesSourceInferred case isOnlyMeshProfile(&options): From 9da830af62cbbf0c7829ee39cf866ca3844e71d2 Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Thu, 3 Jul 2025 09:43:23 -0700 Subject: [PATCH 13/20] Removed source getter. --- conformance/utils/suite/suite.go | 4 ---- conformance/utils/suite/suite_test.go | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index ec726e56ab..85a8f00e61 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -407,10 +407,6 @@ func (suite *ConformanceTestSuite) Setup(t *testing.T, tests []ConformanceTest) } } -func (suite *ConformanceTestSuite) SupportedFeaturesSource() supportedFeaturesSource { - return suite.supportedFeaturesSource -} - func (suite *ConformanceTestSuite) setClientsetForTest(test ConformanceTest) error { featureNames := []string{} for _, v := range test.Features { diff --git a/conformance/utils/suite/suite_test.go b/conformance/utils/suite/suite_test.go index 06ec8a1aba..cdc53f1b24 100644 --- a/conformance/utils/suite/suite_test.go +++ b/conformance/utils/suite/suite_test.go @@ -514,8 +514,8 @@ func TestInferSupportedFeatures(t *testing.T) { t.Fatalf("error initializing conformance suite: %v", err) } - if cSuite.SupportedFeaturesSource() != tc.expectedSource { - t.Errorf("InferredSupportedFeatures mismatch: got %v, want %v", cSuite.SupportedFeaturesSource(), tc.expectedSource) + if cSuite.supportedFeaturesSource != tc.expectedSource { + t.Errorf("InferredSupportedFeatures mismatch: got %v, want %v", cSuite.supportedFeaturesSource, tc.expectedSource) } if equal := cSuite.SupportedFeatures.Equal(tc.expectedFeatures); !equal { From 39b4bf14363ac32712015541db866cd48fec3fde Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Fri, 11 Jul 2025 22:44:54 -0700 Subject: [PATCH 14/20] removed undefined enum and added check for mesh features. --- conformance/utils/suite/suite.go | 26 ++++----- conformance/utils/suite/suite_test.go | 76 +++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 13 deletions(-) diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index 85a8f00e61..0bfdf435e1 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -194,27 +194,28 @@ const ( type supportedFeaturesSource string const ( - supportedFeaturesSourceUndefined supportedFeaturesSource = "Undefined" - supportedFeaturesSourceManual supportedFeaturesSource = "Manual" - supportedFeaturesSourceInferred supportedFeaturesSource = "Inferred" + supportedFeaturesSourceManual supportedFeaturesSource = "Manual" + supportedFeaturesSourceInferred supportedFeaturesSource = "Inferred" ) // NewConformanceTestSuite is a helper to use for creating a new ConformanceTestSuite. func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, error) { supportedFeatures := options.SupportedFeatures.Difference(options.ExemptFeatures) source := supportedFeaturesSourceManual - switch { - case options.EnableAllSupportedFeatures: + if options.EnableAllSupportedFeatures { supportedFeatures = features.SetsToNamesSet(features.AllFeatures) - case shouldInferSupportedFeatures(&options): + } else if shouldInferSupportedFeatures(&options) { var err error supportedFeatures, err = fetchSupportedFeatures(options.Client, options.GatewayClassName) if err != nil { return nil, fmt.Errorf("cannot infer supported features: %w", err) } - source = supportedFeaturesSourceInferred - case isOnlyMeshProfile(&options): - source = supportedFeaturesSourceUndefined + + if hasMeshFeatures(supportedFeatures, &options) { + source = supportedFeaturesSourceManual + } else { + source = supportedFeaturesSourceInferred + } } // If features were not inferred from Status, it's a GWC issue. @@ -652,8 +653,7 @@ func getAPIVersionAndChannel(crds []apiextensionsv1.CustomResourceDefinition) (v return version, channel, nil } -func isOnlyMeshProfile(_ *ConformanceOptions) bool { - // TODO(bexxmodd): Currently a placeholder to add logic that determines if - // it's only Mesh profile without GWC. - return false +func hasMeshFeatures(f FeaturesSet, opt *ConformanceOptions) bool { + return f.HasAny(features.SetsToNamesSet(features.MeshCoreFeatures, features.MeshExtendedFeatures).UnsortedList()...) || + opt.ConformanceProfiles.HasAny(MeshGRPCConformanceProfileName, MeshHTTPConformanceProfileName) } diff --git a/conformance/utils/suite/suite_test.go b/conformance/utils/suite/suite_test.go index cdc53f1b24..011f14f813 100644 --- a/conformance/utils/suite/suite_test.go +++ b/conformance/utils/suite/suite_test.go @@ -525,6 +525,82 @@ func TestInferSupportedFeatures(t *testing.T) { } } +func TestGWCStatusPublishedMeshFeatures(t *testing.T) { + testCases := []struct { + name string + supportedFeatures FeaturesSet + ConformanceProfile sets.Set[ConformanceProfileName] + expectedSource supportedFeaturesSource + }{ + { + name: "GWC Status published Mesh features", + expectedSource: supportedFeaturesSourceManual, + }, + { + name: "supports conformance Mesh profile", + ConformanceProfile: sets.New(MeshGRPCConformanceProfileName), + expectedSource: supportedFeaturesSourceManual, + }, + } + + gwcName := "ochopintre" + gwc := &gatewayv1.GatewayClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: gwcName, + }, + Spec: gatewayv1.GatewayClassSpec{ + ControllerName: "example.com/gateway-controller", + }, + Status: gatewayv1.GatewayClassStatus{ + Conditions: []metav1.Condition{ + { + Type: string(gatewayv1.GatewayConditionAccepted), + Status: metav1.ConditionTrue, + Reason: "Accepted", + Message: "GatewayClass is accepted and ready for use", + }, + }, + SupportedFeatures: featureNamesToSet([]string{ + string(features.SupportGateway), + string(features.SupportGatewayStaticAddresses), + string(features.SupportMeshClusterIPMatching), + string(features.SupportMeshConsumerRoute), + }), + }, + } + scheme := runtime.NewScheme() + scheme.AddKnownTypes(gatewayv1.SchemeGroupVersion, &gatewayv1.GatewayClass{}) + fakeClient := fake.NewClientBuilder(). + WithScheme(scheme). + WithObjects(gwc). + WithLists(&apiextensionsv1.CustomResourceDefinitionList{}). + Build() + + gatewayv1.Install(fakeClient.Scheme()) + apiextensionsv1.AddToScheme(fakeClient.Scheme()) + + for _, tc := range testCases { + options := ConformanceOptions{ + AllowCRDsMismatch: true, + GatewayClassName: gwcName, + SupportedFeatures: tc.supportedFeatures, + ConformanceProfiles: tc.ConformanceProfile, + Client: fakeClient, + } + + t.Run(tc.name, func(t *testing.T) { + cSuite, err := NewConformanceTestSuite(options) + if err != nil { + t.Fatalf("error initializing conformance suite: %v", err) + } + + if cSuite.supportedFeaturesSource != tc.expectedSource { + t.Errorf("InferredSupportedFeatures mismatch: got %v, want %v", cSuite.supportedFeaturesSource, tc.expectedSource) + } + }) + } +} + func featureNamesToSet(set []string) []gatewayv1.SupportedFeature { var features []gatewayv1.SupportedFeature for _, feature := range set { From 968565be7b93095e2b30e2a750b0a0a9753575a9 Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Sun, 13 Jul 2025 20:27:02 -0700 Subject: [PATCH 15/20] return error if mesh features are populated in gwc. --- conformance/utils/suite/suite.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index 0bfdf435e1..ea3c607a53 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -212,7 +212,7 @@ func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, } if hasMeshFeatures(supportedFeatures, &options) { - source = supportedFeaturesSourceManual + return nil, fmt.Errorf("mesh features should not be populated in GatewayClass") } else { source = supportedFeaturesSourceInferred } From abf9d40b9ec6ccc613a6dd0908edf5bcb0b50c38 Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Sun, 13 Jul 2025 21:56:20 -0700 Subject: [PATCH 16/20] Updated unit tests. --- conformance/utils/suite/suite_test.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/conformance/utils/suite/suite_test.go b/conformance/utils/suite/suite_test.go index 011f14f813..76a24c008d 100644 --- a/conformance/utils/suite/suite_test.go +++ b/conformance/utils/suite/suite_test.go @@ -530,16 +530,13 @@ func TestGWCStatusPublishedMeshFeatures(t *testing.T) { name string supportedFeatures FeaturesSet ConformanceProfile sets.Set[ConformanceProfileName] - expectedSource supportedFeaturesSource }{ { - name: "GWC Status published Mesh features", - expectedSource: supportedFeaturesSourceManual, + name: "GWC Status published Mesh features", }, { name: "supports conformance Mesh profile", ConformanceProfile: sets.New(MeshGRPCConformanceProfileName), - expectedSource: supportedFeaturesSourceManual, }, } @@ -589,13 +586,9 @@ func TestGWCStatusPublishedMeshFeatures(t *testing.T) { } t.Run(tc.name, func(t *testing.T) { - cSuite, err := NewConformanceTestSuite(options) - if err != nil { - t.Fatalf("error initializing conformance suite: %v", err) - } - - if cSuite.supportedFeaturesSource != tc.expectedSource { - t.Errorf("InferredSupportedFeatures mismatch: got %v, want %v", cSuite.supportedFeaturesSource, tc.expectedSource) + _, err := NewConformanceTestSuite(options) + if err == nil { + t.Fatalf("expected an error but got none") } }) } From 28bddefe3f86224c1b167c74bdc84f8bd1956abc Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Mon, 14 Jul 2025 07:25:28 -0700 Subject: [PATCH 17/20] Removed check for mesh profile before throwing error for publishing mesh features. As with this error we want to prevent mesh features under GWC, not mesh profiles for testing. --- conformance/utils/suite/suite.go | 3 +-- conformance/utils/suite/suite_test.go | 38 +++++++-------------------- 2 files changed, 10 insertions(+), 31 deletions(-) diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index ea3c607a53..03d6f799ef 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -654,6 +654,5 @@ func getAPIVersionAndChannel(crds []apiextensionsv1.CustomResourceDefinition) (v } func hasMeshFeatures(f FeaturesSet, opt *ConformanceOptions) bool { - return f.HasAny(features.SetsToNamesSet(features.MeshCoreFeatures, features.MeshExtendedFeatures).UnsortedList()...) || - opt.ConformanceProfiles.HasAny(MeshGRPCConformanceProfileName, MeshHTTPConformanceProfileName) + return f.HasAny(features.SetsToNamesSet(features.MeshCoreFeatures, features.MeshExtendedFeatures).UnsortedList()...) } diff --git a/conformance/utils/suite/suite_test.go b/conformance/utils/suite/suite_test.go index 76a24c008d..311da616a2 100644 --- a/conformance/utils/suite/suite_test.go +++ b/conformance/utils/suite/suite_test.go @@ -525,21 +525,7 @@ func TestInferSupportedFeatures(t *testing.T) { } } -func TestGWCStatusPublishedMeshFeatures(t *testing.T) { - testCases := []struct { - name string - supportedFeatures FeaturesSet - ConformanceProfile sets.Set[ConformanceProfileName] - }{ - { - name: "GWC Status published Mesh features", - }, - { - name: "supports conformance Mesh profile", - ConformanceProfile: sets.New(MeshGRPCConformanceProfileName), - }, - } - +func TestGWCPublishedMeshFeatures(t *testing.T) { gwcName := "ochopintre" gwc := &gatewayv1.GatewayClass{ ObjectMeta: metav1.ObjectMeta{ @@ -576,21 +562,15 @@ func TestGWCStatusPublishedMeshFeatures(t *testing.T) { gatewayv1.Install(fakeClient.Scheme()) apiextensionsv1.AddToScheme(fakeClient.Scheme()) - for _, tc := range testCases { - options := ConformanceOptions{ - AllowCRDsMismatch: true, - GatewayClassName: gwcName, - SupportedFeatures: tc.supportedFeatures, - ConformanceProfiles: tc.ConformanceProfile, - Client: fakeClient, - } + options := ConformanceOptions{ + AllowCRDsMismatch: true, + GatewayClassName: gwcName, + Client: fakeClient, + } - t.Run(tc.name, func(t *testing.T) { - _, err := NewConformanceTestSuite(options) - if err == nil { - t.Fatalf("expected an error but got none") - } - }) + _, err := NewConformanceTestSuite(options) + if err == nil { + t.Fatalf("expected an error but got nil") } } From 84b269ad30222bae2e97ba7f7f0162f3d93cf3c1 Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Mon, 14 Jul 2025 07:26:26 -0700 Subject: [PATCH 18/20] removed extra else --- conformance/utils/suite/suite.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index 03d6f799ef..d5dbe0a22b 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -213,9 +213,8 @@ func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, if hasMeshFeatures(supportedFeatures, &options) { return nil, fmt.Errorf("mesh features should not be populated in GatewayClass") - } else { - source = supportedFeaturesSourceInferred } + source = supportedFeaturesSourceInferred } // If features were not inferred from Status, it's a GWC issue. From 0b7a15e58d12141e737a6dc29c03cd9886b403c1 Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Mon, 14 Jul 2025 07:44:24 -0700 Subject: [PATCH 19/20] Removed not needed field from function. --- conformance/utils/suite/suite.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index d5dbe0a22b..f90bce251a 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -652,6 +652,6 @@ func getAPIVersionAndChannel(crds []apiextensionsv1.CustomResourceDefinition) (v return version, channel, nil } -func hasMeshFeatures(f FeaturesSet, opt *ConformanceOptions) bool { +func hasMeshFeatures(f FeaturesSet) bool { return f.HasAny(features.SetsToNamesSet(features.MeshCoreFeatures, features.MeshExtendedFeatures).UnsortedList()...) } From 61bc37a750121db3553d3ab252d7fe3aa1b34ad7 Mon Sep 17 00:00:00 2001 From: Beka Modebadze Date: Mon, 14 Jul 2025 07:55:25 -0700 Subject: [PATCH 20/20] Cleanup of extra field --- conformance/utils/suite/suite.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conformance/utils/suite/suite.go b/conformance/utils/suite/suite.go index f90bce251a..5b30598886 100644 --- a/conformance/utils/suite/suite.go +++ b/conformance/utils/suite/suite.go @@ -211,7 +211,7 @@ func NewConformanceTestSuite(options ConformanceOptions) (*ConformanceTestSuite, return nil, fmt.Errorf("cannot infer supported features: %w", err) } - if hasMeshFeatures(supportedFeatures, &options) { + if hasMeshFeatures(supportedFeatures) { return nil, fmt.Errorf("mesh features should not be populated in GatewayClass") } source = supportedFeaturesSourceInferred