github.com/verrazzano/verrazzano@v1.7.0/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 }