diff --git a/changelog/v1.17.0-rc5/e2e-tests-cleanup.yaml b/changelog/v1.17.0-rc5/e2e-tests-cleanup.yaml new file mode 100644 index 00000000000..50503732c17 --- /dev/null +++ b/changelog/v1.17.0-rc5/e2e-tests-cleanup.yaml @@ -0,0 +1,8 @@ +changelog: + - type: NON_USER_FACING + issueLink: https://github.com/solo-io/gloo/issues/9353 + resolvesIssue: false + description: >- + Make Kubernetes E2E tests easily importable and runnable from enterprise suites + + skipCI-docs-build:true diff --git a/test/kubernetes/e2e/README.md b/test/kubernetes/e2e/README.md index acf286f2e45..20e856f068c 100644 --- a/test/kubernetes/e2e/README.md +++ b/test/kubernetes/e2e/README.md @@ -18,11 +18,21 @@ We define all tests in the [features](./features) package. This is done for a va 1. We group the tests by feature, so it's easy to identify which behaviors we assert for a given feature. 2. We can invoke that same test against different `TestInstallation`s. This means we can test a feature against a variety of installation values, or even against OSS and Enterprise installations. +## Test Suites +A Test Suite is a subset of the Feature concept. A single Feature has at minimum one Test Suite, and can have many. Each Test Suite within the feature must have a function which satisfies the signature `NewSuiteFunc` found in [suite.go](./suite.go). + +These test suites are registered by a name and this func in [Tests](#tests) to be run against various `TestInstallation`s. + ## Tests This package holds the entry point for each of our `TestInstallation`. See [Load balancing tests](./load_balancing_tests.md) for more information about how these tests are run in CI. +Each `*_test.go` file contains a specific test installation and exists within the `tests_test` package. In order for tests to be imported and run from other repos, each `*_test.go` file has a corresponding `*_test.go` file which exists in the `tests` package. This is done because `_test` packages cannot be imported. + +In order to add a feature suite to be run in a given test installation, it must be added to the exported function in the corresponding `*_tests.go` file. +e.g. In order to add a feature suite to be run with the test installation defined in `istio_test.go`, we have to register it by adding it to `IstioTests()` in `istio_tests.go` following the existing paradigm. + ## Environment Variables Some tests may require environment variables to be set. Some required env vars are: @@ -50,4 +60,4 @@ Below are a set of known areas of improvement. The goal is to provide a starting - **Improved install action(s)**: We rely on the [SoloTestHelper](/test/kube2e/helper/install.go) currently, and it would be nice if we relied directly on Helm or Glooctl. - **Cluster provisioning**: We rely on the [setup-kind](/ci/kind/setup-kind.sh) script to provision a cluster. We should make this more flexible by providing a configurable, declarative way to do this. - **Istio action**: We need a way to perform Istio actions against a cluster. -- **Argo action**: We need an easy utility to perform ArgoCD commands against a cluster. \ No newline at end of file +- **Argo action**: We need an easy utility to perform ArgoCD commands against a cluster. diff --git a/test/kubernetes/e2e/features/deployer/istio_integration_deployer_suite.go b/test/kubernetes/e2e/features/deployer/istio_integration_deployer_suite.go index ca2be33c97a..dcbf8760b6f 100644 --- a/test/kubernetes/e2e/features/deployer/istio_integration_deployer_suite.go +++ b/test/kubernetes/e2e/features/deployer/istio_integration_deployer_suite.go @@ -13,6 +13,8 @@ import ( "github.com/solo-io/gloo/test/kubernetes/e2e" ) +var _ e2e.NewSuiteFunc = NewIstioIntegrationTestingSuite + // istioIntegrationDeployerSuite is the entire Suite of tests for the "deployer" feature that relies on an Istio installation // The "deployer" code can be found here: /projects/gateway2/deployer type istioIntegrationDeployerSuite struct { diff --git a/test/kubernetes/e2e/features/deployer/suite.go b/test/kubernetes/e2e/features/deployer/suite.go index d351fbe8dc8..a087e8a404c 100644 --- a/test/kubernetes/e2e/features/deployer/suite.go +++ b/test/kubernetes/e2e/features/deployer/suite.go @@ -21,6 +21,8 @@ import ( "github.com/solo-io/gloo/test/kubernetes/testutils/runtime" ) +var _ e2e.NewSuiteFunc = NewTestingSuite + // testingSuite is the entire Suite of tests for the "deployer" feature // The "deployer" code can be found here: /projects/gateway2/deployer type testingSuite struct { diff --git a/test/kubernetes/e2e/features/example/suite.go b/test/kubernetes/e2e/features/example/suite.go index 4da810b2d2e..b69787805e6 100644 --- a/test/kubernetes/e2e/features/example/suite.go +++ b/test/kubernetes/e2e/features/example/suite.go @@ -9,6 +9,8 @@ import ( "github.com/solo-io/gloo/test/kubernetes/e2e" ) +var _ e2e.NewSuiteFunc = NewTestingSuite + // testingSuite is the entire Suite of tests for the "example" feature // Typically, we would include a link to the feature code here type testingSuite struct { diff --git a/test/kubernetes/e2e/features/glooctl/check_suite.go b/test/kubernetes/e2e/features/glooctl/check_suite.go index 607901282ce..ada55dc3673 100644 --- a/test/kubernetes/e2e/features/glooctl/check_suite.go +++ b/test/kubernetes/e2e/features/glooctl/check_suite.go @@ -10,6 +10,8 @@ import ( "github.com/stretchr/testify/suite" ) +var _ e2e.NewSuiteFunc = NewCheckSuite + // checkSuite contains the set of tests to validate the behavior of `glooctl check` // These tests attempt to mirror: https://github.com/solo-io/gloo/blob/v1.16.x/test/kube2e/glooctl/check_test.go type checkSuite struct { diff --git a/test/kubernetes/e2e/features/glooctl/debug_suite.go b/test/kubernetes/e2e/features/glooctl/debug_suite.go index 887d9f7ce95..e37aa3144bb 100644 --- a/test/kubernetes/e2e/features/glooctl/debug_suite.go +++ b/test/kubernetes/e2e/features/glooctl/debug_suite.go @@ -9,6 +9,8 @@ import ( "github.com/stretchr/testify/suite" ) +var _ e2e.NewSuiteFunc = NewDebugSuite + // debugSuite contains the set of tests to validate the behavior of `glooctl debug` // These tests attempt to mirror: https://github.com/solo-io/gloo/blob/v1.16.x/test/kube2e/glooctl/debug_test.go type debugSuite struct { diff --git a/test/kubernetes/e2e/features/glooctl/get_proxy_suite.go b/test/kubernetes/e2e/features/glooctl/get_proxy_suite.go index c96b4e94917..39e2cfdd417 100644 --- a/test/kubernetes/e2e/features/glooctl/get_proxy_suite.go +++ b/test/kubernetes/e2e/features/glooctl/get_proxy_suite.go @@ -19,6 +19,8 @@ import ( "github.com/stretchr/testify/suite" ) +var _ e2e.NewSuiteFunc = NewGetProxySuite + var ( yamlSeparator = regexp.MustCompile("\n---\n") ) diff --git a/test/kubernetes/e2e/features/glooctl/istio_inject_suite.go b/test/kubernetes/e2e/features/glooctl/istio_inject_suite.go index d34c8c4e6a3..f3f1baea9cc 100644 --- a/test/kubernetes/e2e/features/glooctl/istio_inject_suite.go +++ b/test/kubernetes/e2e/features/glooctl/istio_inject_suite.go @@ -13,6 +13,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +var _ e2e.NewSuiteFunc = NewIstioInjectTestingSuite + // istioInjectTestingSuite is the entire Suite of tests for the "glooctl istio inject" integration cases // NOTE: This suite is not intended to be run as a standalone test suite. It applies the "glooctl istio inject" command // to an existing installation of Gloo Gateway and verifies that the necessary resources are created, but does not clean diff --git a/test/kubernetes/e2e/features/glooctl/istio_uninject_suite.go b/test/kubernetes/e2e/features/glooctl/istio_uninject_suite.go index 50e394c3b62..9e7421231b9 100644 --- a/test/kubernetes/e2e/features/glooctl/istio_uninject_suite.go +++ b/test/kubernetes/e2e/features/glooctl/istio_uninject_suite.go @@ -13,6 +13,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +var _ e2e.NewSuiteFunc = NewIstioUninjectTestingSuite + // istioUninjectTestingSuite is the entire Suite of tests for the "glooctl istio uninject" integration cases // NOTE: This suite is not intended to be run as a standalone test suite. It applies the "glooctl unistio inject" command // to an existing installation of Gloo Gateway where the istio-proxy and sds containers have already been injected diff --git a/test/kubernetes/e2e/features/headless_svc/gloo_gateway_suite.go b/test/kubernetes/e2e/features/headless_svc/gloo_gateway_suite.go index e712aea3959..3b6ca78c0c3 100644 --- a/test/kubernetes/e2e/features/headless_svc/gloo_gateway_suite.go +++ b/test/kubernetes/e2e/features/headless_svc/gloo_gateway_suite.go @@ -13,6 +13,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +var _ e2e.NewSuiteFunc = NewEdgeGatewayHeadlessSvcSuite + type edgeGatewaySuite struct { suite.Suite diff --git a/test/kubernetes/e2e/features/headless_svc/k8s_gw_suite.go b/test/kubernetes/e2e/features/headless_svc/k8s_gw_suite.go index 13e6fbc3957..749ae3ec589 100644 --- a/test/kubernetes/e2e/features/headless_svc/k8s_gw_suite.go +++ b/test/kubernetes/e2e/features/headless_svc/k8s_gw_suite.go @@ -13,6 +13,8 @@ import ( "github.com/solo-io/gloo/test/kubernetes/testutils/resources" ) +var _ e2e.NewSuiteFunc = NewK8sGatewayHeadlessSvcSuite + type k8sGatewaySuite struct { suite.Suite diff --git a/test/kubernetes/e2e/features/http_listener_options/http_lis_opt_suite.go b/test/kubernetes/e2e/features/http_listener_options/http_lis_opt_suite.go index 7650cb2db8b..e0f5177ae90 100644 --- a/test/kubernetes/e2e/features/http_listener_options/http_lis_opt_suite.go +++ b/test/kubernetes/e2e/features/http_listener_options/http_lis_opt_suite.go @@ -15,6 +15,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +var _ e2e.NewSuiteFunc = NewTestingSuite + // testingSuite is the entire Suite of tests for the "HttpListenerOptions" feature type testingSuite struct { suite.Suite diff --git a/test/kubernetes/e2e/features/istio/gloo_gateway_auto_mtls_suite.go b/test/kubernetes/e2e/features/istio/gloo_gateway_auto_mtls_suite.go index 218cda8d910..90225d77622 100644 --- a/test/kubernetes/e2e/features/istio/gloo_gateway_auto_mtls_suite.go +++ b/test/kubernetes/e2e/features/istio/gloo_gateway_auto_mtls_suite.go @@ -16,6 +16,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +var _ e2e.NewSuiteFunc = NewGlooIstioAutoMtlsSuite + // glooIstioAutoMtlsTestingSuite is the entire Suite of tests for the "Istio" integration cases where auto mTLS is enabled type glooIstioAutoMtlsTestingSuite struct { suite.Suite diff --git a/test/kubernetes/e2e/features/istio/gloo_gateway_no_auto_mtls_suite.go b/test/kubernetes/e2e/features/istio/gloo_gateway_no_auto_mtls_suite.go index 17750aa590c..34a05448321 100644 --- a/test/kubernetes/e2e/features/istio/gloo_gateway_no_auto_mtls_suite.go +++ b/test/kubernetes/e2e/features/istio/gloo_gateway_no_auto_mtls_suite.go @@ -16,6 +16,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +var _ e2e.NewSuiteFunc = NewGlooTestingSuite + // glooIstioTestingSuite is the entire Suite of tests for the "Istio" integration cases where auto mtls is disabled // and Upstreams do not have sslConfig values set type glooIstioTestingSuite struct { diff --git a/test/kubernetes/e2e/features/istio/k8s_gateway_auto_mtls_suite.go b/test/kubernetes/e2e/features/istio/k8s_gateway_auto_mtls_suite.go index 489685cdcf4..659e73bb901 100644 --- a/test/kubernetes/e2e/features/istio/k8s_gateway_auto_mtls_suite.go +++ b/test/kubernetes/e2e/features/istio/k8s_gateway_auto_mtls_suite.go @@ -12,6 +12,8 @@ import ( "github.com/solo-io/gloo/test/kubernetes/e2e" ) +var _ e2e.NewSuiteFunc = NewIstioAutoMtlsSuite + // istioMtlsTestingSuite is the entire Suite of tests for the "Istio" integration cases where auto mTLS is enabled type istioAutoMtlsTestingSuite struct { suite.Suite diff --git a/test/kubernetes/e2e/features/istio/k8s_gateway_no_auto_mtls_suite.go b/test/kubernetes/e2e/features/istio/k8s_gateway_no_auto_mtls_suite.go index 0ec8dcb5fa2..0c175a7a4f9 100644 --- a/test/kubernetes/e2e/features/istio/k8s_gateway_no_auto_mtls_suite.go +++ b/test/kubernetes/e2e/features/istio/k8s_gateway_no_auto_mtls_suite.go @@ -11,6 +11,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +var _ e2e.NewSuiteFunc = NewTestingSuite + // istioTestingSuite is the entire Suite of tests for the "Istio" integration cases where auto mtls is disabled // and Upstreams do not have sslConfig values set type istioTestingSuite struct { diff --git a/test/kubernetes/e2e/features/listener_options/lis_opt_suite.go b/test/kubernetes/e2e/features/listener_options/lis_opt_suite.go index 2bf6b30acba..fbf43b57d1e 100644 --- a/test/kubernetes/e2e/features/listener_options/lis_opt_suite.go +++ b/test/kubernetes/e2e/features/listener_options/lis_opt_suite.go @@ -15,6 +15,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +var _ e2e.NewSuiteFunc = NewTestingSuite + // testingSuite is the entire Suite of tests for the "ListenerOptions" feature type testingSuite struct { suite.Suite diff --git a/test/kubernetes/e2e/features/port_routing/suite.go b/test/kubernetes/e2e/features/port_routing/suite.go index 5d6825526df..8b914714a15 100644 --- a/test/kubernetes/e2e/features/port_routing/suite.go +++ b/test/kubernetes/e2e/features/port_routing/suite.go @@ -11,6 +11,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +var _ e2e.NewSuiteFunc = NewTestingSuite + // portRoutingTestingSuite is the entire Suite of tests for the "PortRouting" cases type portRoutingTestingSuite struct { suite.Suite diff --git a/test/kubernetes/e2e/features/route_delegation/suite.go b/test/kubernetes/e2e/features/route_delegation/suite.go index ee30fdaf24a..31f3a0a8c6c 100644 --- a/test/kubernetes/e2e/features/route_delegation/suite.go +++ b/test/kubernetes/e2e/features/route_delegation/suite.go @@ -19,6 +19,8 @@ import ( "github.com/solo-io/gloo/test/kubernetes/testutils/gloogateway" ) +var _ e2e.NewSuiteFunc = NewTestingSuite + type tsuite struct { suite.Suite @@ -33,7 +35,7 @@ type tsuite struct { manifestObjects map[string][]client.Object } -func NewTestingSuite(ctx context.Context, testInst *e2e.TestInstallation) *tsuite { +func NewTestingSuite(ctx context.Context, testInst *e2e.TestInstallation) suite.TestingSuite { return &tsuite{ ctx: ctx, ti: testInst, diff --git a/test/kubernetes/e2e/features/route_options/suite.go b/test/kubernetes/e2e/features/route_options/suite.go index 49c28278f4a..58db20c89f0 100644 --- a/test/kubernetes/e2e/features/route_options/suite.go +++ b/test/kubernetes/e2e/features/route_options/suite.go @@ -19,6 +19,8 @@ import ( testdefaults "github.com/solo-io/gloo/test/kubernetes/e2e/defaults" ) +var _ e2e.NewSuiteFunc = NewTestingSuite + // testingSuite is the entire Suite of tests for the "Route Options" feature type testingSuite struct { suite.Suite diff --git a/test/kubernetes/e2e/features/upstreams/suite.go b/test/kubernetes/e2e/features/upstreams/suite.go index 81eec31f80b..e3d8e21589a 100644 --- a/test/kubernetes/e2e/features/upstreams/suite.go +++ b/test/kubernetes/e2e/features/upstreams/suite.go @@ -14,6 +14,8 @@ import ( "github.com/solo-io/gloo/test/kubernetes/e2e" ) +var _ e2e.NewSuiteFunc = NewTestingSuite + // testingSuite is the entire Suite of tests for the "Upstream" feature type testingSuite struct { suite.Suite diff --git a/test/kubernetes/e2e/features/virtualhost_options/vhost_opt_suite.go b/test/kubernetes/e2e/features/virtualhost_options/vhost_opt_suite.go index 3f85e0f2e01..b42b9182503 100644 --- a/test/kubernetes/e2e/features/virtualhost_options/vhost_opt_suite.go +++ b/test/kubernetes/e2e/features/virtualhost_options/vhost_opt_suite.go @@ -18,6 +18,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +var _ e2e.NewSuiteFunc = NewTestingSuite + // testingSuite is the entire Suite of tests for the "VirtualHostOptions" feature type testingSuite struct { suite.Suite diff --git a/test/kubernetes/e2e/suite.go b/test/kubernetes/e2e/suite.go new file mode 100644 index 00000000000..16434026bc0 --- /dev/null +++ b/test/kubernetes/e2e/suite.go @@ -0,0 +1,87 @@ +package e2e + +import ( + "context" + "testing" + + "github.com/stretchr/testify/suite" +) + +type ( + NewSuiteFunc func(ctx context.Context, testInstallation *TestInstallation) suite.TestingSuite + + namedSuite struct { + name string + newSuite NewSuiteFunc + } + + orderedSuites struct { + suites []namedSuite + } + + suites struct { + suites map[string]NewSuiteFunc + } + + // A SuiteRunner is an interface that allows E2E tests to simply Register tests in one location and execute them + // with Run. + SuiteRunner interface { + Run(ctx context.Context, t *testing.T, testInstallation *TestInstallation) + Register(name string, newSuite NewSuiteFunc) + } +) + +var ( + _ SuiteRunner = new(orderedSuites) + _ SuiteRunner = new(suites) +) + +// NewSuiteRunner returns an implementation of TestRunner that will execute tests as specified +// in the ordered parameter. +// +// NOTE: it should be strongly preferred to use unordered tests. Only pass true to this function +// if there is a clear need for the tests to be ordered, and specify in a comment near the call +// to NewSuiteRunner why the tests need to be ordered. +func NewSuiteRunner(ordered bool) SuiteRunner { + if ordered { + return new(orderedSuites) + } + + return new(suites) +} + +func (o orderedSuites) Run(ctx context.Context, t *testing.T, testInstallation *TestInstallation) { + for _, namedTest := range o.suites { + t.Run(namedTest.name, func(t *testing.T) { + suite.Run(t, namedTest.newSuite(ctx, testInstallation)) + }) + } +} + +func (o *orderedSuites) Register(name string, newSuite NewSuiteFunc) { + if o.suites == nil { + o.suites = make([]namedSuite, 0) + } + o.suites = append(o.suites, namedSuite{ + name: name, + newSuite: newSuite, + }) + +} + +func (u suites) Run(ctx context.Context, t *testing.T, testInstallation *TestInstallation) { + // TODO(jbohanon) does some randomness need to be injected here to ensure they aren't run in the same order every time? + // from https://goplay.tools/snippet/A-qqQCWkFaZ it looks like maps are not stable, but tend toward stability. + for testName, newSuite := range u.suites { + t.Run(testName, func(t *testing.T) { + suite.Run(t, newSuite(ctx, testInstallation)) + }) + } +} + +func (u *suites) Register(name string, newSuite NewSuiteFunc) { + if u.suites == nil { + u.suites = make(map[string]NewSuiteFunc) + } + u.suites[name] = newSuite +} diff --git a/test/kubernetes/e2e/tests/automtls_istio_edge_api_test.go b/test/kubernetes/e2e/tests/automtls_istio_edge_api_test.go index 88471c41241..057979f7b90 100644 --- a/test/kubernetes/e2e/tests/automtls_istio_edge_api_test.go +++ b/test/kubernetes/e2e/tests/automtls_istio_edge_api_test.go @@ -7,13 +7,11 @@ import ( "time" "github.com/solo-io/gloo/test/kube2e/helper" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/headless_svc" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/istio" "github.com/solo-io/skv2/codegen/util" - "github.com/stretchr/testify/suite" "github.com/solo-io/gloo/test/kubernetes/e2e" + . "github.com/solo-io/gloo/test/kubernetes/e2e/tests" "github.com/solo-io/gloo/test/kubernetes/testutils/gloogateway" ) @@ -67,11 +65,5 @@ func TestAutomtlsIstioEdgeApisGateway(t *testing.T) { return testHelper.InstallGloo(ctx, helper.GATEWAY, 5*time.Minute, helper.ExtraArgs("--values", testInstallation.Metadata.ValuesManifestFile)) }) - t.Run("HeadlessSvc", func(t *testing.T) { - suite.Run(t, headless_svc.NewEdgeGatewayHeadlessSvcSuite(ctx, testInstallation)) - }) - - t.Run("IstioIntegration", func(t *testing.T) { - suite.Run(t, istio.NewGlooIstioAutoMtlsSuite(ctx, testInstallation)) - }) + AutomtlsIstioEdgeApiSuiteRunner().Run(ctx, t, testInstallation) } diff --git a/test/kubernetes/e2e/tests/automtls_istio_edge_api_tests.go b/test/kubernetes/e2e/tests/automtls_istio_edge_api_tests.go new file mode 100644 index 00000000000..c0951003fa5 --- /dev/null +++ b/test/kubernetes/e2e/tests/automtls_istio_edge_api_tests.go @@ -0,0 +1,16 @@ +package tests + +import ( + "github.com/solo-io/gloo/test/kubernetes/e2e" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/headless_svc" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/istio" +) + +func AutomtlsIstioEdgeApiSuiteRunner() e2e.SuiteRunner { + automtlsIstioEdgeApiSuiteRunner := e2e.NewSuiteRunner(false) + + automtlsIstioEdgeApiSuiteRunner.Register("HeadlessSvc", headless_svc.NewEdgeGatewayHeadlessSvcSuite) + automtlsIstioEdgeApiSuiteRunner.Register("IstioIntegrationAutoMtls", istio.NewGlooIstioAutoMtlsSuite) + + return automtlsIstioEdgeApiSuiteRunner +} diff --git a/test/kubernetes/e2e/tests/automtls_istio_test.go b/test/kubernetes/e2e/tests/automtls_istio_test.go index 0f4916c901e..fd9f5862b9d 100644 --- a/test/kubernetes/e2e/tests/automtls_istio_test.go +++ b/test/kubernetes/e2e/tests/automtls_istio_test.go @@ -9,12 +9,9 @@ import ( "github.com/solo-io/gloo/test/kube2e/helper" "github.com/solo-io/gloo/test/kubernetes/e2e" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/headless_svc" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/istio" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/port_routing" + . "github.com/solo-io/gloo/test/kubernetes/e2e/tests" "github.com/solo-io/gloo/test/kubernetes/testutils/gloogateway" "github.com/solo-io/skv2/codegen/util" - "github.com/stretchr/testify/suite" ) // TestK8sGatewayIstioAutoMtls is the function which executes a series of tests against a given installation @@ -70,15 +67,5 @@ func TestK8sGatewayIstioAutoMtls(t *testing.T) { return testHelper.InstallGloo(ctx, helper.GATEWAY, 10*time.Minute, helper.ExtraArgs("--values", testInstallation.Metadata.ValuesManifestFile)) }) - t.Run("PortRouting", func(t *testing.T) { - suite.Run(t, port_routing.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("HeadlessSvc", func(t *testing.T) { - suite.Run(t, headless_svc.NewK8sGatewayHeadlessSvcSuite(ctx, testInstallation)) - }) - - t.Run("IstioIntegrationAutoMtls", func(t *testing.T) { - suite.Run(t, istio.NewIstioAutoMtlsSuite(ctx, testInstallation)) - }) + AutomtlsIstioSuiteRunner().Run(ctx, t, testInstallation) } diff --git a/test/kubernetes/e2e/tests/automtls_istio_tests.go b/test/kubernetes/e2e/tests/automtls_istio_tests.go new file mode 100644 index 00000000000..450c7500a36 --- /dev/null +++ b/test/kubernetes/e2e/tests/automtls_istio_tests.go @@ -0,0 +1,18 @@ +package tests + +import ( + "github.com/solo-io/gloo/test/kubernetes/e2e" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/headless_svc" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/istio" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/port_routing" +) + +func AutomtlsIstioSuiteRunner() e2e.SuiteRunner { + automtlsIstioSuiteRunner := e2e.NewSuiteRunner(false) + + automtlsIstioSuiteRunner.Register("PortRouting", port_routing.NewTestingSuite) + automtlsIstioSuiteRunner.Register("HeadlessSvc", headless_svc.NewK8sGatewayHeadlessSvcSuite) + automtlsIstioSuiteRunner.Register("IstioIntegrationAutoMtls", istio.NewIstioAutoMtlsSuite) + + return automtlsIstioSuiteRunner +} diff --git a/test/kubernetes/e2e/tests/edge_gw_test.go b/test/kubernetes/e2e/tests/edge_gw_test.go index 912b8642ac3..b713d61284e 100644 --- a/test/kubernetes/e2e/tests/edge_gw_test.go +++ b/test/kubernetes/e2e/tests/edge_gw_test.go @@ -8,10 +8,9 @@ import ( "github.com/solo-io/gloo/test/kube2e/helper" "github.com/solo-io/gloo/test/kubernetes/e2e" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/headless_svc" + . "github.com/solo-io/gloo/test/kubernetes/e2e/tests" "github.com/solo-io/gloo/test/kubernetes/testutils/gloogateway" "github.com/solo-io/skv2/codegen/util" - "github.com/stretchr/testify/suite" ) // TestGlooGatewayEdgeGateway is the function which executes a series of tests against a given installation where @@ -45,7 +44,5 @@ func TestGlooGatewayEdgeGateway(t *testing.T) { return testHelper.InstallGloo(ctx, helper.GATEWAY, 5*time.Minute, helper.ExtraArgs("--values", testInstallation.Metadata.ValuesManifestFile)) }) - t.Run("HeadlessSvc", func(t *testing.T) { - suite.Run(t, headless_svc.NewEdgeGatewayHeadlessSvcSuite(ctx, testInstallation)) - }) + EdgeGwSuiteRunner().Run(ctx, t, testInstallation) } diff --git a/test/kubernetes/e2e/tests/edge_gw_tests.go b/test/kubernetes/e2e/tests/edge_gw_tests.go new file mode 100644 index 00000000000..0fe5328311e --- /dev/null +++ b/test/kubernetes/e2e/tests/edge_gw_tests.go @@ -0,0 +1,14 @@ +package tests + +import ( + "github.com/solo-io/gloo/test/kubernetes/e2e" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/headless_svc" +) + +func EdgeGwSuiteRunner() e2e.SuiteRunner { + edgeGwSuiteRunner := e2e.NewSuiteRunner(false) + + edgeGwSuiteRunner.Register("HeadlessSvc", headless_svc.NewEdgeGatewayHeadlessSvcSuite) + + return edgeGwSuiteRunner +} diff --git a/test/kubernetes/e2e/tests/glooctl_istio_inject_test.go b/test/kubernetes/e2e/tests/glooctl_istio_inject_test.go index 7ace0f38417..724a877e145 100644 --- a/test/kubernetes/e2e/tests/glooctl_istio_inject_test.go +++ b/test/kubernetes/e2e/tests/glooctl_istio_inject_test.go @@ -7,12 +7,10 @@ import ( "time" "github.com/solo-io/gloo/test/kube2e/helper" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/glooctl" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/istio" "github.com/solo-io/skv2/codegen/util" - "github.com/stretchr/testify/suite" "github.com/solo-io/gloo/test/kubernetes/e2e" + . "github.com/solo-io/gloo/test/kubernetes/e2e/tests" "github.com/solo-io/gloo/test/kubernetes/testutils/gloogateway" ) @@ -66,16 +64,5 @@ func TestGlooctlIstioInjectEdgeApiGateway(t *testing.T) { return testHelper.InstallGloo(ctx, helper.GATEWAY, 5*time.Minute, helper.ExtraArgs("--values", testInstallation.Metadata.ValuesManifestFile)) }) - // NOTE: Order of tests is important here because the tests are dependent on each other (e.g. the inject test must run before the istio test) - t.Run("GlooctlIstioInject", func(t *testing.T) { - suite.Run(t, glooctl.NewIstioInjectTestingSuite(ctx, testInstallation)) - }) - - t.Run("IstioIntegration", func(t *testing.T) { - suite.Run(t, istio.NewGlooTestingSuite(ctx, testInstallation)) - }) - - t.Run("GlooctlIstioUninject", func(t *testing.T) { - suite.Run(t, glooctl.NewIstioUninjectTestingSuite(ctx, testInstallation)) - }) + GlooctlIstioInjectSuiteRunner().Run(ctx, t, testInstallation) } diff --git a/test/kubernetes/e2e/tests/glooctl_istio_inject_tests.go b/test/kubernetes/e2e/tests/glooctl_istio_inject_tests.go new file mode 100644 index 00000000000..f1f5bfdd27b --- /dev/null +++ b/test/kubernetes/e2e/tests/glooctl_istio_inject_tests.go @@ -0,0 +1,17 @@ +package tests + +import ( + "github.com/solo-io/gloo/test/kubernetes/e2e" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/glooctl" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/istio" +) + +func GlooctlIstioInjectSuiteRunner() e2e.SuiteRunner { + // NOTE: Order of tests is important here because the tests are dependent on each other (e.g. the inject test must run before the istio test) + glooctlIstioInjectSuiteRunner := e2e.NewSuiteRunner(true) + + glooctlIstioInjectSuiteRunner.Register("GlooctlIstioInject", glooctl.NewIstioInjectTestingSuite) + glooctlIstioInjectSuiteRunner.Register("IstioIntegration", istio.NewGlooTestingSuite) + glooctlIstioInjectSuiteRunner.Register("GlooctlIstioUninject", glooctl.NewIstioUninjectTestingSuite) + return glooctlIstioInjectSuiteRunner +} diff --git a/test/kubernetes/e2e/tests/istio_edge_api_test.go b/test/kubernetes/e2e/tests/istio_edge_api_test.go index 4e06196ae7b..9cab29e889a 100644 --- a/test/kubernetes/e2e/tests/istio_edge_api_test.go +++ b/test/kubernetes/e2e/tests/istio_edge_api_test.go @@ -8,14 +8,11 @@ import ( "time" "github.com/solo-io/gloo/test/kube2e/helper" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/headless_svc" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/istio" - - "github.com/solo-io/skv2/codegen/util" - "github.com/stretchr/testify/suite" - "github.com/solo-io/gloo/test/kubernetes/e2e" + . "github.com/solo-io/gloo/test/kubernetes/e2e/tests" "github.com/solo-io/gloo/test/kubernetes/testutils/gloogateway" + + "github.com/solo-io/skv2/codegen/util" ) // TestIstioEdgeApiGateway is the function which executes a series of tests against a given installation where @@ -72,11 +69,5 @@ func TestIstioEdgeApiGateway(t *testing.T) { return testHelper.InstallGloo(ctx, helper.GATEWAY, 5*time.Minute, helper.ExtraArgs("--values", testInstallation.Metadata.ValuesManifestFile)) }) - t.Run("HeadlessSvc", func(t *testing.T) { - suite.Run(t, headless_svc.NewEdgeGatewayHeadlessSvcSuite(ctx, testInstallation)) - }) - - t.Run("IstioIntegration", func(t *testing.T) { - suite.Run(t, istio.NewGlooTestingSuite(ctx, testInstallation)) - }) + IstioEdgeApiSuiteRunner().Run(ctx, t, testInstallation) } diff --git a/test/kubernetes/e2e/tests/istio_edge_api_tests.go b/test/kubernetes/e2e/tests/istio_edge_api_tests.go new file mode 100644 index 00000000000..f72e6574b59 --- /dev/null +++ b/test/kubernetes/e2e/tests/istio_edge_api_tests.go @@ -0,0 +1,16 @@ +package tests + +import ( + "github.com/solo-io/gloo/test/kubernetes/e2e" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/headless_svc" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/istio" +) + +func IstioEdgeApiSuiteRunner() e2e.SuiteRunner { + istioEdgeApiSuiteRunner := e2e.NewSuiteRunner(false) + + istioEdgeApiSuiteRunner.Register("HeadlessSvc", headless_svc.NewEdgeGatewayHeadlessSvcSuite) + istioEdgeApiSuiteRunner.Register("IstioIntegration", istio.NewGlooTestingSuite) + + return istioEdgeApiSuiteRunner +} diff --git a/test/kubernetes/e2e/tests/istio_test.go b/test/kubernetes/e2e/tests/istio_test.go index 849ae18941a..4bc587ad2f9 100644 --- a/test/kubernetes/e2e/tests/istio_test.go +++ b/test/kubernetes/e2e/tests/istio_test.go @@ -8,13 +8,9 @@ import ( "github.com/solo-io/gloo/test/kube2e/helper" "github.com/solo-io/gloo/test/kubernetes/e2e" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/deployer" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/headless_svc" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/istio" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/port_routing" + . "github.com/solo-io/gloo/test/kubernetes/e2e/tests" "github.com/solo-io/gloo/test/kubernetes/testutils/gloogateway" "github.com/solo-io/skv2/codegen/util" - "github.com/stretchr/testify/suite" ) // TestK8sGatewayIstio is the function which executes a series of tests against a given installation @@ -67,19 +63,5 @@ func TestK8sGatewayIstio(t *testing.T) { return testHelper.InstallGloo(ctx, helper.GATEWAY, 10*time.Minute, helper.ExtraArgs("--values", testInstallation.Metadata.ValuesManifestFile)) }) - t.Run("PortRouting", func(t *testing.T) { - suite.Run(t, port_routing.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("HeadlessSvc", func(t *testing.T) { - suite.Run(t, headless_svc.NewK8sGatewayHeadlessSvcSuite(ctx, testInstallation)) - }) - - t.Run("IstioIntegration", func(t *testing.T) { - suite.Run(t, istio.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("IstioGatewayParameters", func(t *testing.T) { - suite.Run(t, deployer.NewIstioIntegrationTestingSuite(ctx, testInstallation)) - }) + IstioSuiteRunner().Run(ctx, t, testInstallation) } diff --git a/test/kubernetes/e2e/tests/istio_tests.go b/test/kubernetes/e2e/tests/istio_tests.go new file mode 100644 index 00000000000..2502e1840e8 --- /dev/null +++ b/test/kubernetes/e2e/tests/istio_tests.go @@ -0,0 +1,20 @@ +package tests + +import ( + "github.com/solo-io/gloo/test/kubernetes/e2e" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/deployer" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/headless_svc" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/istio" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/port_routing" +) + +func IstioSuiteRunner() e2e.SuiteRunner { + istioSuiteRunner := e2e.NewSuiteRunner(false) + + istioSuiteRunner.Register("PortRouting", port_routing.NewTestingSuite) + istioSuiteRunner.Register("HeadlessSvc", headless_svc.NewK8sGatewayHeadlessSvcSuite) + istioSuiteRunner.Register("IstioIntegration", istio.NewTestingSuite) + istioSuiteRunner.Register("IstioGatewayParameters", deployer.NewIstioIntegrationTestingSuite) + + return istioSuiteRunner +} diff --git a/test/kubernetes/e2e/tests/k8s_gw_no_validation_test.go b/test/kubernetes/e2e/tests/k8s_gw_no_validation_test.go index 731e972321d..2810145b1c0 100644 --- a/test/kubernetes/e2e/tests/k8s_gw_no_validation_test.go +++ b/test/kubernetes/e2e/tests/k8s_gw_no_validation_test.go @@ -7,14 +7,10 @@ import ( "time" "github.com/solo-io/skv2/codegen/util" - "github.com/stretchr/testify/suite" "github.com/solo-io/gloo/test/kube2e/helper" "github.com/solo-io/gloo/test/kubernetes/e2e" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/listener_options" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/port_routing" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/route_options" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/virtualhost_options" + . "github.com/solo-io/gloo/test/kubernetes/e2e/tests" "github.com/solo-io/gloo/test/kubernetes/testutils/gloogateway" ) @@ -49,20 +45,5 @@ func TestK8sGatewayNoValidation(t *testing.T) { return testHelper.InstallGloo(ctx, helper.GATEWAY, 5*time.Minute, helper.ExtraArgs("--values", testInstallation.Metadata.ValuesManifestFile)) }) - t.Run("ListenerOptions", func(t *testing.T) { - suite.Run(t, listener_options.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("RouteOptions", func(t *testing.T) { - suite.Run(t, route_options.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("VirtualHostOptions", func(t *testing.T) { - suite.Run(t, virtualhost_options.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("PortRouting", func(t *testing.T) { - suite.Run(t, port_routing.NewTestingSuite(ctx, testInstallation)) - - }) + KubeGatewayNoValidationSuiteRunner().Run(ctx, t, testInstallation) } diff --git a/test/kubernetes/e2e/tests/k8s_gw_no_validation_tests.go b/test/kubernetes/e2e/tests/k8s_gw_no_validation_tests.go new file mode 100644 index 00000000000..74090f6c162 --- /dev/null +++ b/test/kubernetes/e2e/tests/k8s_gw_no_validation_tests.go @@ -0,0 +1,20 @@ +package tests + +import ( + "github.com/solo-io/gloo/test/kubernetes/e2e" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/listener_options" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/port_routing" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/route_options" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/virtualhost_options" +) + +func KubeGatewayNoValidationSuiteRunner() e2e.SuiteRunner { + kubeGatewayNoValidationSuiteRunner := e2e.NewSuiteRunner(false) + + kubeGatewayNoValidationSuiteRunner.Register("ListenerOptions", listener_options.NewTestingSuite) + kubeGatewayNoValidationSuiteRunner.Register("RouteOptions", route_options.NewTestingSuite) + kubeGatewayNoValidationSuiteRunner.Register("VirtualHostOptions", virtualhost_options.NewTestingSuite) + kubeGatewayNoValidationSuiteRunner.Register("PortRouting", port_routing.NewTestingSuite) + + return kubeGatewayNoValidationSuiteRunner +} diff --git a/test/kubernetes/e2e/tests/k8s_gw_test.go b/test/kubernetes/e2e/tests/k8s_gw_test.go index 41a2dd3e919..c2771c27314 100644 --- a/test/kubernetes/e2e/tests/k8s_gw_test.go +++ b/test/kubernetes/e2e/tests/k8s_gw_test.go @@ -9,21 +9,10 @@ import ( "github.com/solo-io/gloo/pkg/utils/env" "github.com/solo-io/gloo/test/kube2e/helper" "github.com/solo-io/gloo/test/kubernetes/e2e" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/deployer" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/glooctl" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/headless_svc" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/http_listener_options" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/listener_options" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/port_routing" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/route_delegation" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/route_options" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/services" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/upstreams" - "github.com/solo-io/gloo/test/kubernetes/e2e/features/virtualhost_options" + . "github.com/solo-io/gloo/test/kubernetes/e2e/tests" "github.com/solo-io/gloo/test/kubernetes/testutils/gloogateway" "github.com/solo-io/gloo/test/testutils" "github.com/solo-io/skv2/codegen/util" - "github.com/stretchr/testify/suite" ) // TestK8sGateway is the function which executes a series of tests against a given installation @@ -57,57 +46,5 @@ func TestK8sGateway(t *testing.T) { return testHelper.InstallGloo(ctx, helper.GATEWAY, 5*time.Minute, helper.ExtraArgs("--values", testInstallation.Metadata.ValuesManifestFile)) }) - t.Run("Deployer", func(t *testing.T) { - suite.Run(t, deployer.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("HttpListenerOptions", func(t *testing.T) { - suite.Run(t, http_listener_options.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("ListenerOptions", func(t *testing.T) { - suite.Run(t, listener_options.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("RouteOptions", func(t *testing.T) { - suite.Run(t, route_options.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("VirtualHostOptions", func(t *testing.T) { - suite.Run(t, virtualhost_options.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("Upstreams", func(t *testing.T) { - suite.Run(t, upstreams.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("Services", func(t *testing.T) { - suite.Run(t, services.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("HeadlessSvc", func(t *testing.T) { - suite.Run(t, headless_svc.NewK8sGatewayHeadlessSvcSuite(ctx, testInstallation)) - }) - - t.Run("PortRouting", func(t *testing.T) { - suite.Run(t, port_routing.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("RouteDelegation", func(t *testing.T) { - suite.Run(t, route_delegation.NewTestingSuite(ctx, testInstallation)) - }) - - t.Run("Glooctl", func(t *testing.T) { - t.Run("Check", func(t *testing.T) { - suite.Run(t, glooctl.NewCheckSuite(ctx, testInstallation)) - }) - - t.Run("Debug", func(t *testing.T) { - suite.Run(t, glooctl.NewDebugSuite(ctx, testInstallation)) - }) - - t.Run("GetProxy", func(t *testing.T) { - suite.Run(t, glooctl.NewGetProxySuite(ctx, testInstallation)) - }) - }) + KubeGatewaySuiteRunner().Run(ctx, t, testInstallation) } diff --git a/test/kubernetes/e2e/tests/k8s_gw_tests.go b/test/kubernetes/e2e/tests/k8s_gw_tests.go new file mode 100644 index 00000000000..0f88fcf7bea --- /dev/null +++ b/test/kubernetes/e2e/tests/k8s_gw_tests.go @@ -0,0 +1,63 @@ +package tests + +import ( + "context" + + "github.com/solo-io/gloo/test/kubernetes/e2e" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/deployer" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/glooctl" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/headless_svc" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/http_listener_options" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/listener_options" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/port_routing" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/route_delegation" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/route_options" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/services" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/upstreams" + "github.com/solo-io/gloo/test/kubernetes/e2e/features/virtualhost_options" + "github.com/stretchr/testify/suite" +) + +func KubeGatewaySuiteRunner() e2e.SuiteRunner { + kubeGatewaySuiteRunner := e2e.NewSuiteRunner(false) + + kubeGatewaySuiteRunner.Register("Deployer", deployer.NewTestingSuite) + kubeGatewaySuiteRunner.Register("HttpListenerOptions", http_listener_options.NewTestingSuite) + kubeGatewaySuiteRunner.Register("ListenerOptions", listener_options.NewTestingSuite) + kubeGatewaySuiteRunner.Register("RouteOptions", route_options.NewTestingSuite) + kubeGatewaySuiteRunner.Register("VirtualHostOptions", virtualhost_options.NewTestingSuite) + kubeGatewaySuiteRunner.Register("Upstreams", upstreams.NewTestingSuite) + kubeGatewaySuiteRunner.Register("Services", services.NewTestingSuite) + kubeGatewaySuiteRunner.Register("HeadlessSvc", headless_svc.NewK8sGatewayHeadlessSvcSuite) + kubeGatewaySuiteRunner.Register("PortRouting", port_routing.NewTestingSuite) + kubeGatewaySuiteRunner.Register("RouteDelegation", route_delegation.NewTestingSuite) + kubeGatewaySuiteRunner.Register("Glooctl", newGlooctlTestingSuite) + + return kubeGatewaySuiteRunner +} + +// We need to define tests requiring nesting as their own suites in order to support the injection paradigm +type glooctlSuite struct { + suite.Suite + ctx context.Context + testInstallation *e2e.TestInstallation +} + +func newGlooctlTestingSuite(ctx context.Context, testInstallation *e2e.TestInstallation) suite.TestingSuite { + return &glooctlSuite{ + ctx: ctx, + testInstallation: testInstallation, + } +} + +func (s *glooctlSuite) TestCheck() { + suite.Run(s.T(), glooctl.NewCheckSuite(s.ctx, s.testInstallation)) +} + +func (s *glooctlSuite) TestDebug() { + suite.Run(s.T(), glooctl.NewDebugSuite(s.ctx, s.testInstallation)) +} + +func (s *glooctlSuite) TestGetProxy() { + suite.Run(s.T(), glooctl.NewGetProxySuite(s.ctx, s.testInstallation)) +}