github.com/redhat-appstudio/e2e-tests@v0.0.0-20230619105049-9a422b2094d7/pkg/framework/framework.go (about)

     1  package framework
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	. "github.com/onsi/ginkgo/v2"
     8  
     9  	"github.com/avast/retry-go/v4"
    10  	kubeCl "github.com/redhat-appstudio/e2e-tests/pkg/apis/kubernetes"
    11  	"github.com/redhat-appstudio/e2e-tests/pkg/constants"
    12  	"github.com/redhat-appstudio/e2e-tests/pkg/sandbox"
    13  	"github.com/redhat-appstudio/e2e-tests/pkg/utils"
    14  	"github.com/redhat-appstudio/e2e-tests/pkg/utils/common"
    15  	"github.com/redhat-appstudio/e2e-tests/pkg/utils/gitops"
    16  	"github.com/redhat-appstudio/e2e-tests/pkg/utils/has"
    17  	"github.com/redhat-appstudio/e2e-tests/pkg/utils/integration"
    18  	"github.com/redhat-appstudio/e2e-tests/pkg/utils/jvmbuildservice"
    19  	"github.com/redhat-appstudio/e2e-tests/pkg/utils/o11y"
    20  	"github.com/redhat-appstudio/e2e-tests/pkg/utils/release"
    21  	"github.com/redhat-appstudio/e2e-tests/pkg/utils/spi"
    22  	"github.com/redhat-appstudio/e2e-tests/pkg/utils/tekton"
    23  )
    24  
    25  type ControllerHub struct {
    26  	HasController             *has.SuiteController
    27  	CommonController          *common.SuiteController
    28  	TektonController          *tekton.SuiteController
    29  	GitOpsController          *gitops.SuiteController
    30  	SPIController             *spi.SuiteController
    31  	ReleaseController         *release.SuiteController
    32  	IntegrationController     *integration.SuiteController
    33  	JvmbuildserviceController *jvmbuildservice.SuiteController
    34  	O11yController            *o11y.SuiteController
    35  }
    36  
    37  type Framework struct {
    38  	AsKubeAdmin       *ControllerHub
    39  	AsKubeDeveloper   *ControllerHub
    40  	ProxyUrl          string
    41  	SandboxController *sandbox.SandboxController
    42  	UserNamespace     string
    43  	UserName          string
    44  	UserToken         string
    45  }
    46  
    47  func NewFramework(userName string) (*Framework, error) {
    48  	return NewFrameworkWithTimeout(userName, time.Second*60)
    49  }
    50  
    51  func NewFrameworkWithTimeout(userName string, timeout time.Duration) (*Framework, error) {
    52  	var err error
    53  	var k *kubeCl.K8SClient
    54  
    55  	// https://issues.redhat.com/browse/CRT-1670
    56  	if len(userName) > 20 {
    57  		GinkgoWriter.Printf("WARNING: username %q is longer than 20 characters - the tenant namespace prefix will be shortened to %s\n", userName, userName[:20])
    58  	}
    59  
    60  	// in some very rare cases fail to get the client for some timeout in member operator.
    61  	// Just try several times to get the user kubeconfig
    62  
    63  	err = retry.Do(
    64  		func() error {
    65  			if k, err = kubeCl.NewDevSandboxProxyClient(userName); err != nil {
    66  				GinkgoWriter.Printf("error when creating dev sandbox proxy client: %+v\n", err)
    67  			}
    68  			return err
    69  		},
    70  		retry.Attempts(20),
    71  	)
    72  
    73  	if err != nil {
    74  		return nil, fmt.Errorf("error when initializing kubernetes clients: %v", err)
    75  	}
    76  
    77  	asAdmin, err := InitControllerHub(k.AsKubeAdmin)
    78  	if err != nil {
    79  		return nil, fmt.Errorf("error when initializing appstudio hub controllers for admin user: %v", err)
    80  	}
    81  
    82  	asUser, err := InitControllerHub(k.AsKubeDeveloper)
    83  	if err != nil {
    84  		return nil, fmt.Errorf("error when initializing appstudio hub controllers for sandbox user: %v", err)
    85  	}
    86  
    87  	if err = utils.WaitUntil(asAdmin.CommonController.ServiceaccountPresent(constants.DefaultPipelineServiceAccount, k.UserNamespace), timeout); err != nil {
    88  		return nil, fmt.Errorf("'%s' service account wasn't created in %s namespace: %+v", constants.DefaultPipelineServiceAccount, k.UserNamespace, err)
    89  	}
    90  
    91  	if err = asAdmin.CommonController.AddRegistryAuthSecretToSA("QUAY_TOKEN", k.UserNamespace); err != nil {
    92  		GinkgoWriter.Println(fmt.Sprintf("Failed to add registry auth secret to service account: %v\n", err))
    93  	}
    94  
    95  	return &Framework{
    96  		AsKubeAdmin:       asAdmin,
    97  		AsKubeDeveloper:   asUser,
    98  		ProxyUrl:          k.ProxyUrl,
    99  		SandboxController: k.SandboxController,
   100  		UserNamespace:     k.UserNamespace,
   101  		UserName:          k.UserName,
   102  		UserToken:         k.UserToken,
   103  	}, nil
   104  }
   105  
   106  func InitControllerHub(cc *kubeCl.CustomClient) (*ControllerHub, error) {
   107  	// Initialize Common controller
   108  	commonCtrl, err := common.NewSuiteController(cc)
   109  	if err != nil {
   110  		return nil, err
   111  	}
   112  
   113  	// Initialize Has controller
   114  	hasController, err := has.NewSuiteController(cc)
   115  	if err != nil {
   116  		return nil, err
   117  	}
   118  
   119  	spiController, err := spi.NewSuiteController(cc)
   120  	if err != nil {
   121  		return nil, err
   122  	}
   123  	// Initialize Tekton controller
   124  	tektonController := tekton.NewSuiteController(cc)
   125  
   126  	// Initialize GitOps controller
   127  	gitopsController, err := gitops.NewSuiteController(cc)
   128  	if err != nil {
   129  		return nil, err
   130  	}
   131  
   132  	// Initialize Release Controller
   133  	releaseController, err := release.NewSuiteController(cc)
   134  	if err != nil {
   135  		return nil, err
   136  	}
   137  	// Initialize Integration Controller
   138  	integrationController, err := integration.NewSuiteController(cc)
   139  	if err != nil {
   140  		return nil, err
   141  	}
   142  	jvmbuildserviceController, err := jvmbuildservice.NewSuiteControler(cc)
   143  	if err != nil {
   144  		return nil, err
   145  	}
   146  	// Initialize o11y controller
   147  	o11yController, err := o11y.NewSuiteController(cc)
   148  	if err != nil {
   149  		return nil, err
   150  	}
   151  
   152  	return &ControllerHub{
   153  		HasController:             hasController,
   154  		CommonController:          commonCtrl,
   155  		SPIController:             spiController,
   156  		TektonController:          tektonController,
   157  		GitOpsController:          gitopsController,
   158  		ReleaseController:         releaseController,
   159  		IntegrationController:     integrationController,
   160  		JvmbuildserviceController: jvmbuildserviceController,
   161  		O11yController:            o11yController,
   162  	}, nil
   163  
   164  }