Skip to content

Commit

Permalink
test: RHTAPBUGS-941 and RTAPBUGS-942 Merge pkg/apis and pkg/clients i…
Browse files Browse the repository at this point in the history
…n one folder under /pkg/clients + All interaction with RHTAP controllers should not be placed in utils folder (konflux-ci#880)

* RHTAPBUGS-941 and RTAPBUGS-942

* improvements

* fix "Implicit memory aliasing in for loop."

* update Guidelines.md

* split pkg/utils/util.go

* fix

* fix Potential HTTP request made with variable url
  • Loading branch information
rsoaresd authored Nov 15, 2023
1 parent 1db2c97 commit 987ec51
Show file tree
Hide file tree
Showing 105 changed files with 994 additions and 925 deletions.
8 changes: 4 additions & 4 deletions docs/Guidelines.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ The purpose of *this* document is to serve as a primer for developers/qe who are
## General tips

* Make sure you've implemented any required controller functionality that is required for your tests within the following files
* `pkg/utils/<new controller directory>` - logic to interact with kube controllers via API
* `pkg/clients/<new controller directory>` - logic to interact with kube controllers via API
* `pkg/framework/framework.go` - import the new controller and update the `Framework` struct to be able to initialize the new controller
* Every test package should be imported to [cmd/e2e_test.go](https://github.com/redhat-appstudio/e2e-tests/blob/main/cmd/e2e_test.go#L15).
* Every new test should have correct [labels](docs/LabelsNaming.md).
Expand All @@ -13,7 +13,7 @@ The purpose of *this* document is to serve as a primer for developers/qe who are
* When running via mage you can filter the suites run by specifying the
`E2E_TEST_SUITE_LABEL` environment variable. For example:
`E2E_TEST_SUITE_LABEL=ec ./mage runE2ETests`
* `klog` level can be controled via `KLOG_VERBOSITY` environment variable. For
* `klog` level can be controlled via `KLOG_VERBOSITY` environment variable. For
example: `KLOG_VERBOSITY=9 ./mage runE2ETests` would output http requests
issued via Kubernetes client from sigs.k8s.io/controller-runtime
* To quickly debug a test, you can run only the desired suite. Example: `./bin/e2e-appstudio --ginkgo.focus="e2e-demos-suite"`
Expand Down Expand Up @@ -85,11 +85,11 @@ This is a basic layout for RHTAP E2E framework project. It is a set of common di
* `/magefiles`: The code definition about installing and running the e2e tests
* `/pipelines`: Tekton pipelines utilities for QE team like IC.
* `/pkg`: All used and imported packages for e2e tests.
* `/pkg/clients`: Defintion of different clients connection providers like Slack, GitHub, Kubernetes Server.
* `/pkg/clients`: Definition of different clients connection providers (like Slack, GitHub, and Kubernetes Server) and all API interaction with different RHTAP controllers.
* `/pkg/constants`: Global constants of the e2e tests.
* `/pkg/framework`: In the framework folder are all controllers initialization, tests reports and the interaction with Report Portal.
* `/pkg/logs`: Tests logging utilities.
* `/pkg/sandbox`: Initialize Sandbox controller to make authenticated requests to a Kubernetes server.
* `/pkg/utils`: Util folders where all API interaction with different RHTAP controllers. Also some tests utils can be found in `/pkg/utils/util.go`.
* `/pkg/utils`: Util folders with all auxiliary functions used in the different RHTAP controllers. Futhermore, it also contains some tests utils that can be found in `/pkg/utils/util.go`.
* `/scripts`: Scripts to perform operations which cannot be do it at magefiles level.
* `/tests`: Folder where all RHTAP tests are defined and documented.
2 changes: 1 addition & 1 deletion magefiles/installation/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (
"github.com/go-git/go-git/v5/plumbing"

appclientset "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned"
kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/apis/kubernetes"
kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/clients/kubernetes"
"github.com/redhat-appstudio/e2e-tests/pkg/constants"
"github.com/redhat-appstudio/e2e-tests/pkg/utils"
corev1 "k8s.io/api/core/v1"
Expand Down
13 changes: 7 additions & 6 deletions magefiles/magefile.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,12 @@ import (
"github.com/magefile/mage/sh"
"github.com/redhat-appstudio/e2e-tests/magefiles/installation"
"github.com/redhat-appstudio/e2e-tests/magefiles/testspecs"
"github.com/redhat-appstudio/e2e-tests/pkg/apis/github"
"github.com/redhat-appstudio/e2e-tests/pkg/clients/github"
"github.com/redhat-appstudio/e2e-tests/pkg/clients/slack"
"github.com/redhat-appstudio/e2e-tests/pkg/clients/sprayproxy"
"github.com/redhat-appstudio/e2e-tests/pkg/constants"
"github.com/redhat-appstudio/e2e-tests/pkg/utils"
"github.com/redhat-appstudio/e2e-tests/pkg/utils/tekton"
"github.com/redhat-appstudio/image-controller/pkg/quay"
tektonapi "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
)
Expand Down Expand Up @@ -373,10 +374,10 @@ func (ci CI) setRequiredEnvVars() error {
if err = utils.CreateDockerConfigFile(os.Getenv("QUAY_TOKEN")); err != nil {
return fmt.Errorf("failed to create docker config file: %+v", err)
}
if defaultBundleRef, err = utils.GetDefaultPipelineBundleRef(constants.BuildPipelineSelectorYamlURL, "Java"); err != nil {
if defaultBundleRef, err = tekton.GetDefaultPipelineBundleRef(constants.BuildPipelineSelectorYamlURL, "Java"); err != nil {
return fmt.Errorf("failed to get the pipeline bundle ref: %+v", err)
}
if tektonObj, err = utils.ExtractTektonObjectFromBundle(defaultBundleRef, "pipeline", "java-builder"); err != nil {
if tektonObj, err = tekton.ExtractTektonObjectFromBundle(defaultBundleRef, "pipeline", "java-builder"); err != nil {
return fmt.Errorf("failed to extract the Tekton Pipeline from bundle: %+v", err)
}
javaPipelineObj := tektonObj.(tektonapi.PipelineObject)
Expand All @@ -400,7 +401,7 @@ func (ci CI) setRequiredEnvVars() error {
break
}
}
if tektonObj, err = utils.ExtractTektonObjectFromBundle(currentS2iJavaTaskRef, "task", "s2i-java"); err != nil {
if tektonObj, err = tekton.ExtractTektonObjectFromBundle(currentS2iJavaTaskRef, "task", "s2i-java"); err != nil {
return fmt.Errorf("failed to extract the Tekton Task from bundle: %+v", err)
}
taskObj := tektonObj.(tektonapi.TaskObject)
Expand All @@ -421,10 +422,10 @@ func (ci CI) setRequiredEnvVars() error {
keychain := authn.NewMultiKeychain(authn.DefaultKeychain)
authOption := remoteimg.WithAuthFromKeychain(keychain)

if err = utils.BuildAndPushTektonBundle(newTaskYaml, newS2iJavaTaskRef, authOption); err != nil {
if err = tekton.BuildAndPushTektonBundle(newTaskYaml, newS2iJavaTaskRef, authOption); err != nil {
return fmt.Errorf("error when building/pushing a tekton task bundle: %v", err)
}
if err = utils.BuildAndPushTektonBundle(newPipelineYaml, newJavaBuilderPipelineRef, authOption); err != nil {
if err = tekton.BuildAndPushTektonBundle(newPipelineYaml, newJavaBuilderPipelineRef, authOption); err != nil {
return fmt.Errorf("error when building/pushing a tekton pipeline bundle: %v", err)
}
os.Setenv(constants.CUSTOM_JAVA_PIPELINE_BUILD_BUNDLE_ENV, newJavaBuilderPipelineRef.String())
Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package common

import (
"github.com/redhat-appstudio/e2e-tests/pkg/apis/github"
kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/apis/kubernetes"
"github.com/redhat-appstudio/e2e-tests/pkg/clients/github"
kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/clients/kubernetes"
"github.com/redhat-appstudio/e2e-tests/pkg/constants"
"github.com/redhat-appstudio/e2e-tests/pkg/utils"
)
Expand Down
File renamed without changes.
File renamed without changes.
11 changes: 0 additions & 11 deletions pkg/utils/common/pod.go → pkg/clients/common/pod.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
. "github.com/onsi/ginkgo/v2"
"github.com/redhat-appstudio/e2e-tests/pkg/logs"
"github.com/redhat-appstudio/e2e-tests/pkg/utils"
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
Expand Down Expand Up @@ -53,16 +52,6 @@ func (s *SuiteController) IsPodSuccessful(podName, namespace string) wait.Condit
}
}

// TaskPodExists checks if a task have a pod
func TaskPodExists(tr *v1beta1.TaskRun) wait.ConditionFunc {
return func() (bool, error) {
if tr.Status.PodName != "" {
return true, nil
}
return false, nil
}
}

// ListPods return a list of pods from a namespace by labels and selection limits
func (s *SuiteController) ListPods(namespace, labelKey, labelValue string, selectionLimit int64) (*corev1.PodList, error) {
labelSelector := metav1.LabelSelector{MatchLabels: map[string]string{labelKey: labelValue}}
Expand Down
60 changes: 60 additions & 0 deletions pkg/clients/common/proxy_plugin.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package common

import (
"context"
"fmt"
"time"

toolchainv1alpha1 "github.com/codeready-toolchain/api/api/v1alpha1"
"github.com/redhat-appstudio/e2e-tests/pkg/utils"
"github.com/redhat-appstudio/e2e-tests/pkg/utils/common"

k8sErrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
)

// CreateProxyPlugin creates an object of ProxyPlugin for the OpenShift route target
func (s *SuiteController) CreateProxyPlugin(proxyPluginName, proxyPluginNamespace, routeName, routeNamespace string) (*toolchainv1alpha1.ProxyPlugin, error) {
// Create the ProxyPlugin object
proxyPlugin := common.NewProxyPlugin(proxyPluginName, proxyPluginNamespace, routeName, routeNamespace)

if err := s.KubeRest().Create(context.Background(), proxyPlugin); err != nil {
return nil, fmt.Errorf("unable to create proxy plugin due to %v", err)
}
return proxyPlugin, nil
}

// DeleteProxyPlugin deletes the ProxyPlugin object
func (s *SuiteController) DeleteProxyPlugin(proxyPluginName, proxyPluginNamespace string) (bool, error) {
proxyPlugin := &toolchainv1alpha1.ProxyPlugin{
ObjectMeta: metav1.ObjectMeta{
Name: proxyPluginName,
Namespace: proxyPluginNamespace,
},
}

if err := s.KubeRest().Delete(context.Background(), proxyPlugin); err != nil {
return false, err
}
err := utils.WaitUntil(func() (done bool, err error) {
err = s.KubeRest().Get(context.Background(), types.NamespacedName{
Namespace: proxyPluginNamespace,
Name: proxyPluginName,
}, proxyPlugin)

if err != nil {
if k8sErrors.IsNotFound(err) {
return true, nil
}
return false, fmt.Errorf("deletion of proxy plugin has been timedout:: %v", err)
}
return false, nil
}, 5*time.Minute)

if err != nil {
return false, err
}

return true, nil
}
1 change: 0 additions & 1 deletion pkg/utils/common/rbac.go → pkg/clients/common/rbac.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ func (s *SuiteController) ListRoles(namespace string) (*rbacv1.RoleList, error)
}

func (s *SuiteController) ListRoleBindings(namespace string) (*rbacv1.RoleBindingList, error) {

listOptions := metav1.ListOptions{}
return s.KubeInterface().RbacV1().RoleBindings(namespace).List(context.Background(), listOptions)
}
Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ func (s *SuiteController) LinkSecretToServiceAccount(ns, secret, serviceaccount
})
}

// UnlinkSecretFromServiceAcocount unlinks secret from service account
// UnlinkSecretFromServiceAccount unlinks secret from service account
func (s *SuiteController) UnlinkSecretFromServiceAccount(namespace, secretName, serviceAccount string, rmImagePullSecrets bool) error {
serviceAccountObject, err := s.KubeInterface().CoreV1().ServiceAccounts(namespace).Get(context.Background(), serviceAccount, metav1.GetOptions{})
if err != nil {
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ func (s *SuiteController) GetServiceAccount(saName, namespace string) (*corev1.S
return s.KubeInterface().CoreV1().ServiceAccounts(namespace).Get(context.Background(), saName, metav1.GetOptions{})
}

func (s *SuiteController) ServiceaccountPresent(saName, namespace string) wait.ConditionFunc {
func (s *SuiteController) ServiceAccountPresent(saName, namespace string) wait.ConditionFunc {
return func() (bool, error) {
_, err := s.GetServiceAccount(saName, namespace)
if err != nil {
Expand Down
File renamed without changes.
File renamed without changes.
4 changes: 4 additions & 0 deletions pkg/apis/github/client.go → pkg/clients/github/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ import (
"golang.org/x/oauth2"
)

const (
HEADS = "heads/%s"
)

type Github struct {
client *github.Client
organization string
Expand Down
8 changes: 4 additions & 4 deletions pkg/apis/github/git.go → pkg/clients/github/git.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (
)

func (g *Github) DeleteRef(repository, branchName string) error {
_, err := g.client.Git.DeleteRef(context.Background(), g.organization, repository, fmt.Sprintf("heads/%s", branchName))
_, err := g.client.Git.DeleteRef(context.Background(), g.organization, repository, fmt.Sprintf(HEADS, branchName))
if err != nil {
return err
}
Expand All @@ -24,12 +24,12 @@ func (g *Github) DeleteRef(repository, branchName string) error {
// the latest commit from base branch will be used.
func (g *Github) CreateRef(repository, baseBranchName, sha, newBranchName string) error {
ctx := context.Background()
ref, _, err := g.client.Git.GetRef(ctx, g.organization, repository, fmt.Sprintf("heads/%s", baseBranchName))
ref, _, err := g.client.Git.GetRef(ctx, g.organization, repository, fmt.Sprintf(HEADS, baseBranchName))
if err != nil {
return fmt.Errorf("error when getting the base branch name '%s' for the repo '%s': %+v", baseBranchName, repository, err)
}

ref.Ref = github.String(fmt.Sprintf("heads/%s", newBranchName))
ref.Ref = github.String(fmt.Sprintf(HEADS, newBranchName))

if sha != "" {
ref.Object.SHA = &sha
Expand All @@ -49,7 +49,7 @@ func (g *Github) CreateRef(repository, baseBranchName, sha, newBranchName string
}

func (g *Github) ExistsRef(repository, branchName string) (bool, error) {
_, _, err := g.client.Git.GetRef(context.Background(), g.organization, repository, fmt.Sprintf("heads/%s", branchName))
_, _, err := g.client.Git.GetRef(context.Background(), g.organization, repository, fmt.Sprintf(HEADS, branchName))
if err != nil {
if strings.Contains(err.Error(), "404 Not Found") {
return false, nil
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func (g *Github) CreateFile(repository, pathToFile, fileContent, branchName stri
func (g *Github) GetFile(repository, pathToFile, branchName string) (*github.RepositoryContent, error) {
opts := &github.RepositoryContentGetOptions{}
if branchName != "" {
opts.Ref = fmt.Sprintf("heads/%s", branchName)
opts.Ref = fmt.Sprintf(HEADS, branchName)
}
file, _, _, err := g.client.Repositories.GetContents(context.Background(), g.organization, repository, pathToFile, opts)
if err != nil {
Expand All @@ -49,7 +49,7 @@ func (g *Github) GetFile(repository, pathToFile, branchName string) (*github.Rep
func (g *Github) UpdateFile(repository, pathToFile, newContent, branchName, fileSHA string) (*github.RepositoryContentResponse, error) {
opts := &github.RepositoryContentGetOptions{}
if branchName != "" {
opts.Ref = fmt.Sprintf("heads/%s", branchName)
opts.Ref = fmt.Sprintf(HEADS, branchName)
}
newFileContent := &github.RepositoryContentFileOptions{
Message: github.String("e2e test commit message"),
Expand All @@ -70,7 +70,7 @@ func (g *Github) DeleteFile(repository, pathToFile, branchName string) error {
deleteOpts := &github.RepositoryContentFileOptions{}

if branchName != "" {
getOpts.Ref = fmt.Sprintf("heads/%s", branchName)
getOpts.Ref = fmt.Sprintf(HEADS, branchName)
deleteOpts.Branch = github.String(branchName)
}
file, _, _, err := g.client.Repositories.GetContents(context.Background(), g.organization, repository, pathToFile, getOpts)
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package gitops

import (
kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/apis/kubernetes"
kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/clients/kubernetes"
)

// Factory to initialize the comunication against different APIs like kubernetes.
// Factory to initialize the communication against different APIs like kubernetes.
type GitopsController struct {
// Generates a client to interact with kubernetes clusters.
*kubeCl.CustomClient
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (
)

// HaveAvailableDeploymentTargetClassExist attempts to find a DeploymentTargetClass with appstudioApi.Provisioner_Devsandbox as provisioner.
// reurn nil if not found
// return nil if not found
func (g *GitopsController) HaveAvailableDeploymentTargetClassExist() (*appservice.DeploymentTargetClass, error) {
deploymentTargetClassList := &appservice.DeploymentTargetClassList{}
err := g.KubeRest().List(context.Background(), deploymentTargetClassList)
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
appservice "github.com/redhat-appstudio/application-api/api/v1alpha1"
"github.com/redhat-appstudio/e2e-tests/pkg/logs"
"github.com/redhat-appstudio/e2e-tests/pkg/utils"
"github.com/redhat-appstudio/e2e-tests/pkg/utils/gitops"
k8sErrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
Expand Down Expand Up @@ -42,7 +43,7 @@ func (h *HasController) ApplicationDevfilePresent(application *appservice.Applic
// ApplicationGitopsRepoExists check from the devfile content if application-service creates a gitops repo in GitHub.
func (s *HasController) ApplicationGitopsRepoExists(devfileContent string) wait.ConditionFunc {
return func() (bool, error) {
gitOpsRepoURL := utils.ObtainGitOpsRepositoryName(devfileContent)
gitOpsRepoURL := gitops.ObtainGitOpsRepositoryName(devfileContent)
return s.Github.CheckIfRepositoryExist(gitOpsRepoURL), nil
}
}
Expand Down
File renamed without changes.
12 changes: 8 additions & 4 deletions pkg/utils/has/components.go → pkg/clients/has/components.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ import (
"github.com/devfile/library/v2/pkg/util"
. "github.com/onsi/ginkgo/v2"
appservice "github.com/redhat-appstudio/application-api/api/v1alpha1"
"github.com/redhat-appstudio/e2e-tests/pkg/clients/tekton"
"github.com/redhat-appstudio/e2e-tests/pkg/constants"
"github.com/redhat-appstudio/e2e-tests/pkg/logs"
"github.com/redhat-appstudio/e2e-tests/pkg/utils"
"github.com/redhat-appstudio/e2e-tests/pkg/utils/build"
"github.com/redhat-appstudio/e2e-tests/pkg/utils/tekton"
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
k8sErrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand All @@ -29,6 +29,10 @@ import (
"sigs.k8s.io/yaml"
)

const (
RequiredLabelNotFound = "cannot retrigger PipelineRun - required label %q not found"
)

// GetComponent return a component object from kubernetes cluster
func (h *HasController) GetComponent(name string, namespace string) (*appservice.Component, error) {
component := &appservice.Component{}
Expand Down Expand Up @@ -330,15 +334,15 @@ func (h *HasController) RetriggerComponentPipelineRun(component *appservice.Comp
targetBranchAnnotationName := "build.appstudio.redhat.com/target_branch"

if repoName, ok = prLabels[pacRepoNameLabelName]; !ok {
return "", fmt.Errorf("cannot retrigger PipelineRun - required label %q not found", pacRepoNameLabelName)
return "", fmt.Errorf(RequiredLabelNotFound, pacRepoNameLabelName)
}
if eventType, ok = prLabels[pacEventTypeLabelName]; !ok {
return "", fmt.Errorf("cannot retrigger PipelineRun - required label %q not found", pacEventTypeLabelName)
return "", fmt.Errorf(RequiredLabelNotFound, pacEventTypeLabelName)
}
// PipelineRun is triggered from a pull request, need to update the PaC PR source branch
if eventType == "pull_request" {
if len(prLabels[componentLabelName]) < 1 {
return "", fmt.Errorf("cannot retrigger PipelineRun - required label %q not found", componentLabelName)
return "", fmt.Errorf(RequiredLabelNotFound, componentLabelName)
}
branchName = constants.PaCPullRequestBranchPrefix + prLabels[componentLabelName]
} else {
Expand Down
4 changes: 2 additions & 2 deletions pkg/utils/has/controller.go → pkg/clients/has/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import (
"github.com/redhat-appstudio/e2e-tests/pkg/constants"
"github.com/redhat-appstudio/e2e-tests/pkg/utils"

"github.com/redhat-appstudio/e2e-tests/pkg/apis/github"
kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/apis/kubernetes"
"github.com/redhat-appstudio/e2e-tests/pkg/clients/github"
kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/clients/kubernetes"
)

// Factory to initialize the comunication against different API like github or kubernetes.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package imagecontroller

import (
kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/apis/kubernetes"
kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/clients/kubernetes"
)

type ImageController struct {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package integration

import (
kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/apis/kubernetes"
kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/clients/kubernetes"
)

type IntegrationController struct {
Expand Down
Loading

0 comments on commit 987ec51

Please sign in to comment.