github.com/verrazzano/verrazzano@v1.7.1/cluster-operator/internal/capi/client.go (about)

     1  // Copyright (c) 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 capi
     5  
     6  import (
     7  	"context"
     8  	"fmt"
     9  
    10  	corev1 "k8s.io/api/core/v1"
    11  	"k8s.io/apimachinery/pkg/runtime"
    12  	"k8s.io/apimachinery/pkg/types"
    13  	"k8s.io/client-go/tools/clientcmd"
    14  	clipkg "sigs.k8s.io/controller-runtime/pkg/client"
    15  )
    16  
    17  // GetClusterClient creates a controller-runtime client for a given CAPI cluster reference, if the kubeconfig for that cluster is available.
    18  func GetClusterClient(ctx context.Context, cli clipkg.Client, cluster types.NamespacedName, scheme *runtime.Scheme) (clipkg.Client, error) {
    19  	kubeconfigSecret := &corev1.Secret{}
    20  	kubeconfigSecretNSN := types.NamespacedName{
    21  		Namespace: cluster.Namespace,
    22  		Name:      fmt.Sprintf("%s-kubeconfig", cluster.Name),
    23  	}
    24  	if err := cli.Get(ctx, kubeconfigSecretNSN, kubeconfigSecret); err != nil {
    25  		return nil, err
    26  	}
    27  	kubeconfig, ok := kubeconfigSecret.Data["value"]
    28  	if !ok {
    29  		return nil, fmt.Errorf("no kubeconfig found for cluster %s/%s", cluster.Namespace, cluster.Name)
    30  	}
    31  	config, err := clientcmd.RESTConfigFromKubeConfig(kubeconfig)
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  	return clipkg.New(config, clipkg.Options{
    36  		Scheme: scheme,
    37  	})
    38  }