github.com/ironcore-dev/gardener-extension-provider-ironcore@v0.3.2-0.20240314231816-8336447fb9a0/pkg/ironcore/clientutils.go (about) 1 // SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and IronCore contributors 2 // SPDX-License-Identifier: Apache-2.0 3 4 package ironcore 5 6 import ( 7 "context" 8 "fmt" 9 10 extensionscontroller "github.com/gardener/gardener/extensions/pkg/controller" 11 v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" 12 extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" 13 computev1alpha1 "github.com/ironcore-dev/ironcore/api/compute/v1alpha1" 14 ipamv1alpha1 "github.com/ironcore-dev/ironcore/api/ipam/v1alpha1" 15 networkingv1alpha1 "github.com/ironcore-dev/ironcore/api/networking/v1alpha1" 16 storagev1alpha1 "github.com/ironcore-dev/ironcore/api/storage/v1alpha1" 17 corev1 "k8s.io/api/core/v1" 18 "k8s.io/apimachinery/pkg/runtime" 19 utilruntime "k8s.io/apimachinery/pkg/util/runtime" 20 "k8s.io/client-go/tools/clientcmd" 21 "sigs.k8s.io/controller-runtime/pkg/client" 22 ) 23 24 var ironcoreScheme = runtime.NewScheme() 25 26 func init() { 27 utilruntime.Must(corev1.AddToScheme(ironcoreScheme)) 28 utilruntime.Must(networkingv1alpha1.AddToScheme(ironcoreScheme)) 29 utilruntime.Must(computev1alpha1.AddToScheme(ironcoreScheme)) 30 utilruntime.Must(storagev1alpha1.AddToScheme(ironcoreScheme)) 31 utilruntime.Must(ipamv1alpha1.AddToScheme(ironcoreScheme)) 32 utilruntime.Must(extensionsv1alpha1.AddToScheme(ironcoreScheme)) 33 } 34 35 // GetIroncoreClientAndNamespaceFromCloudProviderSecret extracts the <ironcoreClient, ironcoreNamespace> from the 36 // cloudprovider secret in the Shoot namespace. 37 func GetIroncoreClientAndNamespaceFromCloudProviderSecret(ctx context.Context, cl client.Client, shootNamespace string) (client.Client, string, error) { 38 secret := &corev1.Secret{} 39 secretKey := client.ObjectKey{Namespace: shootNamespace, Name: v1beta1constants.SecretNameCloudProvider} 40 if err := cl.Get(ctx, secretKey, secret); err != nil { 41 return nil, "", fmt.Errorf("failed to get cloudprovider secret: %w", err) 42 } 43 kubeconfig, ok := secret.Data["kubeconfig"] 44 if !ok { 45 return nil, "", fmt.Errorf("could not find a kubeconfig in the cloudprovider secret") 46 } 47 namespace, ok := secret.Data["namespace"] 48 if !ok { 49 return nil, "", fmt.Errorf("could not find a namespace in the cloudprovider secret") 50 } 51 clientCfg, err := clientcmd.RESTConfigFromKubeConfig(kubeconfig) 52 if err != nil { 53 return nil, "", fmt.Errorf("failed to create rest config from cloudprovider secret: %w", err) 54 } 55 c, err := client.New(clientCfg, client.Options{Scheme: ironcoreScheme}) 56 if err != nil { 57 return nil, "", fmt.Errorf("failed to create client from cloudprovider secret: %w", err) 58 } 59 60 return c, string(namespace), nil 61 } 62 63 // GetIroncoreClientAndNamespaceFromSecretRef extracts the <ironcoreClient, ironcoreNamespace> from the 64 // provided secret 65 func GetIroncoreClientAndNamespaceFromSecretRef(ctx context.Context, cl client.Client, secretRef *corev1.SecretReference) (client.Client, string, error) { 66 secret, err := extensionscontroller.GetSecretByReference(ctx, cl, secretRef) 67 if err != nil { 68 return nil, "", err 69 } 70 71 if secret.Data == nil { 72 return nil, "", fmt.Errorf("secret does not contain any data") 73 } 74 kubeconfig, ok := secret.Data["kubeconfig"] 75 if !ok { 76 return nil, "", fmt.Errorf("could not find a kubeconfig in the secret") 77 } 78 namespace, ok := secret.Data["namespace"] 79 if !ok { 80 return nil, "", fmt.Errorf("could not find a namespace in the secret") 81 } 82 clientCfg, err := clientcmd.RESTConfigFromKubeConfig(kubeconfig) 83 if err != nil { 84 return nil, "", fmt.Errorf("failed to create rest config from secret: %w", err) 85 } 86 c, err := client.New(clientCfg, client.Options{Scheme: ironcoreScheme}) 87 if err != nil { 88 return nil, "", fmt.Errorf("failed to create client from secret: %w", err) 89 } 90 91 return c, string(namespace), nil 92 }