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  }