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 }