github.com/verrazzano/verrazzano@v1.7.1/tools/psr/backend/pkg/k8sclient/client.go (about)

     1  // Copyright (c) 2022, 2023, Oracle and/or its affiliates.
     2  // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
     3  
     4  package k8sclient
     5  
     6  import (
     7  	"fmt"
     8  	vzv1alpha1 "github.com/verrazzano/verrazzano/platform-operator/apis/verrazzano/v1alpha1"
     9  	vpoClient "github.com/verrazzano/verrazzano/platform-operator/clientset/versioned"
    10  	corev1 "k8s.io/api/core/v1"
    11  	k8sapiext "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
    12  	"k8s.io/client-go/dynamic"
    13  	controllerruntime "sigs.k8s.io/controller-runtime"
    14  	"sigs.k8s.io/controller-runtime/pkg/client"
    15  	"time"
    16  )
    17  
    18  // PsrClient contains the client sets for accessing various resource
    19  type PsrClient struct {
    20  	CrtlRuntime client.Client
    21  	VzInstall   vpoClient.Interface
    22  	DynClient   dynamic.Interface
    23  }
    24  
    25  // NewPsrClient returns a PSR client.
    26  // Try several times to get the client.  This fixes timing issue
    27  // where connections fails if Istio sidecar not ready
    28  func NewPsrClient() (PsrClient, error) {
    29  	const max = 15
    30  	var retErr error
    31  	for i := 1; i <= max; i++ {
    32  		c, err := tryNewPsrClient()
    33  		if err == nil {
    34  			return c, nil
    35  		}
    36  		retErr = err
    37  		time.Sleep(1 * time.Second)
    38  	}
    39  	return PsrClient{}, retErr
    40  }
    41  
    42  // tryNewPsrClient returns the set of clients used by PSR
    43  func tryNewPsrClient() (PsrClient, error) {
    44  	p := PsrClient{}
    45  
    46  	// Create the controller runtime client and add core resources to the scheme
    47  	// Along with Verrazzano
    48  	cfg, err := controllerruntime.GetConfig()
    49  	if err != nil {
    50  		return PsrClient{}, fmt.Errorf("Failed to get controller-runtime config %v", err)
    51  	}
    52  	p.CrtlRuntime, err = client.New(cfg, client.Options{})
    53  	if err != nil {
    54  		return PsrClient{}, fmt.Errorf("Failed to create a controller-runtime client %v", err)
    55  	}
    56  	_ = corev1.AddToScheme(p.CrtlRuntime.Scheme())
    57  	_ = k8sapiext.AddToScheme(p.CrtlRuntime.Scheme())
    58  	_ = vzv1alpha1.AddToScheme(p.CrtlRuntime.Scheme())
    59  
    60  	// Create the client for accessing the Verrazzano API
    61  	p.VzInstall, err = vpoClient.NewForConfig(cfg)
    62  	if err != nil {
    63  		return PsrClient{}, err
    64  	}
    65  	p.DynClient, err = dynamic.NewForConfig(cfg)
    66  	if err != nil {
    67  		return PsrClient{}, err
    68  	}
    69  	return p, nil
    70  }