diff --git a/internal/gatewayapi/conformance/suite.go b/internal/gatewayapi/conformance/suite.go index b3804f06b6..afe9f93e3d 100644 --- a/internal/gatewayapi/conformance/suite.go +++ b/internal/gatewayapi/conformance/suite.go @@ -13,16 +13,31 @@ import ( ) // SkipTests is a list of tests that are skipped in the conformance suite. -var SkipTests = []suite.ConformanceTest{ - tests.GatewayStaticAddresses, - tests.GatewayInfrastructure, +func SkipTests(gatewayNamespaceMode bool) []suite.ConformanceTest { + if gatewayNamespaceMode { + return []suite.ConformanceTest{ + tests.GatewayStaticAddresses, + tests.GatewayInfrastructure, // https://github.com/envoyproxy/gateway/pull/5996 will fix this later. + } + } + + return []suite.ConformanceTest{ + tests.GatewayStaticAddresses, + tests.GatewayInfrastructure, + } } // SkipFeatures is a list of features that are skipped in the conformance report. -var SkipFeatures = sets.New[features.FeatureName]( - features.GatewayStaticAddressesFeature.Name, - features.GatewayInfrastructurePropagationFeature.Name, -) +func SkipFeatures(gatewayNamespaceMode bool) sets.Set[features.FeatureName] { + if gatewayNamespaceMode { + return sets.New(features.GatewayStaticAddressesFeature.Name) + } + + return sets.New( + features.GatewayStaticAddressesFeature.Name, + features.GatewayInfrastructurePropagationFeature.Name, + ) +} func skipTestsShortNames(skipTests []suite.ConformanceTest) []string { shortNames := make([]string, len(skipTests)) @@ -33,30 +48,33 @@ func skipTestsShortNames(skipTests []suite.ConformanceTest) []string { } // EnvoyGatewaySuite is the conformance suite configuration for the Gateway API. -var EnvoyGatewaySuite = suite.ConformanceOptions{ - SupportedFeatures: allFeatures(), - ExemptFeatures: meshFeatures(), - SkipTests: skipTestsShortNames(SkipTests), +func EnvoyGatewaySuite(gatewayNamespaceMode bool) suite.ConformanceOptions { + return suite.ConformanceOptions{ + SupportedFeatures: allFeatures(gatewayNamespaceMode), + ExemptFeatures: meshFeatures(), + SkipTests: skipTestsShortNames(SkipTests(gatewayNamespaceMode)), + } } -func allFeatures() sets.Set[features.FeatureName] { - allFeatures := sets.New[features.FeatureName]() +func allFeatures(gatewayNamespaceMode bool) sets.Set[features.FeatureName] { + result := sets.New[features.FeatureName]() + skipped := SkipFeatures(gatewayNamespaceMode) for _, feature := range features.AllFeatures.UnsortedList() { - // Dont add skipped features in the conformance report. - if !SkipFeatures.Has(feature.Name) { - allFeatures.Insert(feature.Name) + // Don't add skipped features in the conformance report. + if !skipped.Has(feature.Name) { + result.Insert(feature.Name) } } - return allFeatures + return result } func meshFeatures() sets.Set[features.FeatureName] { - meshFeatures := sets.New[features.FeatureName]() + result := sets.New[features.FeatureName]() for _, feature := range features.MeshCoreFeatures.UnsortedList() { - meshFeatures.Insert(feature.Name) + result.Insert(feature.Name) } for _, feature := range features.MeshExtendedFeatures.UnsortedList() { - meshFeatures.Insert(feature.Name) + result.Insert(feature.Name) } - return meshFeatures + return result } diff --git a/internal/gatewayapi/status/gatewayclass.go b/internal/gatewayapi/status/gatewayclass.go index ee49b49345..a2cd4ed121 100644 --- a/internal/gatewayapi/status/gatewayclass.go +++ b/internal/gatewayapi/status/gatewayclass.go @@ -71,10 +71,6 @@ func computeGatewayClassAcceptedCondition(gatewayClass *gwapiv1.GatewayClass, } } -// GatewaySupportedFeatures is a list of supported Gateway-API features, -// based on the running conformance tests suite. -var GatewaySupportedFeatures = getSupportedFeatures(conformance.EnvoyGatewaySuite, conformance.SkipTests) - func getSupportedFeatures(gatewaySuite suite.ConformanceOptions, skippedTests []suite.ConformanceTest) []gwapiv1.SupportedFeature { supportedFeatures := gatewaySuite.SupportedFeatures.Clone() unsupportedFeatures := getUnsupportedFeatures(gatewaySuite, skippedTests) diff --git a/test/conformance/conformance_test.go b/test/conformance/conformance_test.go index b27cb0cc69..99b0494562 100644 --- a/test/conformance/conformance_test.go +++ b/test/conformance/conformance_test.go @@ -16,19 +16,34 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log/zap" "sigs.k8s.io/gateway-api/conformance" "sigs.k8s.io/gateway-api/conformance/tests" + "sigs.k8s.io/gateway-api/conformance/utils/flags" "sigs.k8s.io/gateway-api/conformance/utils/suite" + "sigs.k8s.io/gateway-api/conformance/utils/tlog" internalconf "github.com/envoyproxy/gateway/internal/gatewayapi/conformance" + ege2etest "github.com/envoyproxy/gateway/test/e2e/tests" ) func TestGatewayAPIConformance(t *testing.T) { flag.Parse() log.SetLogger(zap.New(zap.WriteTo(os.Stderr), zap.UseDevMode(true))) + if flags.RunTest != nil && *flags.RunTest != "" { + tlog.Logf(t, "Running Conformance test %s with %s GatewayClass\n cleanup: %t\n debug: %t", + *flags.RunTest, *flags.GatewayClassName, *flags.CleanupBaseResources, *flags.ShowDebug) + } else { + tlog.Logf(t, "Running Conformance tests with %s GatewayClass\n cleanup: %t\n debug: %t", + *flags.GatewayClassName, *flags.CleanupBaseResources, *flags.ShowDebug) + } + + gatewayNamespaceMode := ege2etest.IsGatewayNamespaceMode() + internalSuite := internalconf.EnvoyGatewaySuite(gatewayNamespaceMode) + opts := conformance.DefaultOptions(t) - opts.SkipTests = internalconf.EnvoyGatewaySuite.SkipTests - opts.SupportedFeatures = internalconf.EnvoyGatewaySuite.SupportedFeatures - opts.ExemptFeatures = internalconf.EnvoyGatewaySuite.ExemptFeatures + opts.SkipTests = internalSuite.SkipTests + opts.SupportedFeatures = internalSuite.SupportedFeatures + opts.ExemptFeatures = internalSuite.ExemptFeatures + opts.RunTest = *flags.RunTest cSuite, err := suite.NewConformanceTestSuite(opts) if err != nil { diff --git a/test/conformance/experimental_conformance_test.go b/test/conformance/experimental_conformance_test.go index ea1fb0389e..1d25ad0b74 100644 --- a/test/conformance/experimental_conformance_test.go +++ b/test/conformance/experimental_conformance_test.go @@ -30,10 +30,13 @@ func TestExperimentalConformance(t *testing.T) { flag.Parse() log.SetLogger(zap.New(zap.WriteTo(os.Stderr), zap.UseDevMode(true))) + internalSuite := internalconf.EnvoyGatewaySuite(false) + opts := conformance.DefaultOptions(t) - opts.SkipTests = internalconf.EnvoyGatewaySuite.SkipTests - opts.SupportedFeatures = internalconf.EnvoyGatewaySuite.SupportedFeatures - opts.ExemptFeatures = internalconf.EnvoyGatewaySuite.ExemptFeatures + opts.SkipTests = internalSuite.SkipTests + opts.SupportedFeatures = internalSuite.SupportedFeatures + opts.ExemptFeatures = internalSuite.ExemptFeatures + opts.ConformanceProfiles = sets.New( suite.GatewayHTTPConformanceProfileName, suite.GatewayTLSConformanceProfileName, diff --git a/tools/make/kube.mk b/tools/make/kube.mk index d9ba808457..53cdb5ee5a 100644 --- a/tools/make/kube.mk +++ b/tools/make/kube.mk @@ -25,6 +25,8 @@ BENCHMARK_CONNECTIONS ?= 100 BENCHMARK_DURATION ?= 60 BENCHMARK_REPORT_DIR ?= benchmark_report +CONFORMANCE_RUN_TEST ?= + E2E_RUN_TEST ?= E2E_CLEANUP ?= true E2E_TIMEOUT ?= 20m @@ -295,7 +297,11 @@ run-conformance: prepare-ip-family ## Run Gateway API conformance. @$(LOG_TARGET) kubectl wait --timeout=$(WAIT_TIMEOUT) -n envoy-gateway-system deployment/envoy-gateway --for=condition=Available kubectl apply -f test/config/gatewayclass.yaml +ifeq ($(CONFORMANCE_RUN_TEST),) go test -v -tags conformance ./test/conformance --gateway-class=envoy-gateway --debug=true +else + go test -v -tags conformance ./test/conformance --gateway-class=envoy-gateway --debug=true --run-test $(CONFORMANCE_RUN_TEST) +endif CONFORMANCE_REPORT_PATH ?=