github.com/kubeshop/testkube@v1.17.23/pkg/configmap/client.go (about)

     1  package configmap
     2  
     3  import (
     4  	"context"
     5  
     6  	"go.uber.org/zap"
     7  	v1 "k8s.io/api/core/v1"
     8  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
     9  	corev1 "k8s.io/client-go/applyconfigurations/core/v1"
    10  	"k8s.io/client-go/kubernetes"
    11  
    12  	"github.com/kubeshop/testkube/pkg/k8sclient"
    13  	"github.com/kubeshop/testkube/pkg/log"
    14  )
    15  
    16  //go:generate mockgen -destination=./mock_client.go -package=configmap "github.com/kubeshop/testkube/pkg/configmap" Interface
    17  type Interface interface {
    18  	Get(ctx context.Context, id string, namespace ...string) (map[string]string, error)
    19  	Create(ctx context.Context, id string, stringData map[string]string) error
    20  	Apply(ctx context.Context, id string, stringData map[string]string) error
    21  	Update(ctx context.Context, id string, stringData map[string]string) error
    22  }
    23  
    24  // Client provide methods to manage configmaps
    25  type Client struct {
    26  	ClientSet *kubernetes.Clientset
    27  	Log       *zap.SugaredLogger
    28  	Namespace string
    29  }
    30  
    31  // NewClient is a method to create new configmap client
    32  func NewClient(namespace string) (*Client, error) {
    33  	clientSet, err := k8sclient.ConnectToK8s()
    34  	if err != nil {
    35  		return nil, err
    36  	}
    37  
    38  	return &Client{
    39  		ClientSet: clientSet,
    40  		Log:       log.DefaultLogger,
    41  		Namespace: namespace,
    42  	}, nil
    43  }
    44  
    45  // Create is a method to create new configmap
    46  func (c *Client) Create(ctx context.Context, id string, stringData map[string]string) error {
    47  	configMapsClient := c.ClientSet.CoreV1().ConfigMaps(c.Namespace)
    48  
    49  	configMapSpec := NewSpec(id, c.Namespace, stringData)
    50  	if _, err := configMapsClient.Create(ctx, configMapSpec, metav1.CreateOptions{}); err != nil {
    51  		return err
    52  	}
    53  
    54  	return nil
    55  }
    56  
    57  // Get is a method to retrieve an existing configmap
    58  func (c *Client) Get(ctx context.Context, id string, namespace ...string) (map[string]string, error) {
    59  	ns := c.Namespace
    60  	if len(namespace) != 0 {
    61  		ns = namespace[0]
    62  	}
    63  
    64  	configMapsClient := c.ClientSet.CoreV1().ConfigMaps(ns)
    65  
    66  	configMapSpec, err := configMapsClient.Get(ctx, id, metav1.GetOptions{})
    67  	if err != nil {
    68  		return nil, err
    69  	}
    70  
    71  	stringData := map[string]string{}
    72  	for key, value := range configMapSpec.Data {
    73  		stringData[key] = value
    74  	}
    75  
    76  	return stringData, nil
    77  }
    78  
    79  // Update is a method to update an existing configmap
    80  func (c *Client) Update(ctx context.Context, id string, stringData map[string]string) error {
    81  	configMapsClient := c.ClientSet.CoreV1().ConfigMaps(c.Namespace)
    82  
    83  	configMapSpec := NewSpec(id, c.Namespace, stringData)
    84  	if _, err := configMapsClient.Update(ctx, configMapSpec, metav1.UpdateOptions{}); err != nil {
    85  		return err
    86  	}
    87  
    88  	return nil
    89  }
    90  
    91  // Apply is a method to create or update a configmap
    92  func (c *Client) Apply(ctx context.Context, id string, stringData map[string]string) error {
    93  	configMapsClient := c.ClientSet.CoreV1().ConfigMaps(c.Namespace)
    94  
    95  	configMapSpec := NewApplySpec(id, c.Namespace, stringData)
    96  	if _, err := configMapsClient.Apply(ctx, configMapSpec, metav1.ApplyOptions{
    97  		FieldManager: "application/apply-patch"}); err != nil {
    98  		return err
    99  	}
   100  
   101  	return nil
   102  }
   103  
   104  // NewSpec is a method to return configmap spec
   105  func NewSpec(id, namespace string, stringData map[string]string) *v1.ConfigMap {
   106  	configuration := &v1.ConfigMap{
   107  		ObjectMeta: metav1.ObjectMeta{
   108  			Name:      id,
   109  			Namespace: namespace,
   110  		},
   111  		Data: stringData,
   112  	}
   113  
   114  	return configuration
   115  }
   116  
   117  // NewApplySpec is a method to return configmap apply spec
   118  func NewApplySpec(id, namespace string, stringData map[string]string) *corev1.ConfigMapApplyConfiguration {
   119  	configuration := corev1.ConfigMap(id, namespace).
   120  		WithData(stringData)
   121  
   122  	return configuration
   123  }