github.com/spotahome/redis-operator@v1.2.4/service/k8s/configmap.go (about)

     1  package k8s
     2  
     3  import (
     4  	"context"
     5  
     6  	corev1 "k8s.io/api/core/v1"
     7  	"k8s.io/apimachinery/pkg/api/errors"
     8  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
     9  	"k8s.io/client-go/kubernetes"
    10  
    11  	"github.com/spotahome/redis-operator/log"
    12  	"github.com/spotahome/redis-operator/metrics"
    13  )
    14  
    15  // ConfigMap the ServiceAccount service that knows how to interact with k8s to manage them
    16  type ConfigMap interface {
    17  	GetConfigMap(namespace string, name string) (*corev1.ConfigMap, error)
    18  	CreateConfigMap(namespace string, configMap *corev1.ConfigMap) error
    19  	UpdateConfigMap(namespace string, configMap *corev1.ConfigMap) error
    20  	CreateOrUpdateConfigMap(namespace string, np *corev1.ConfigMap) error
    21  	DeleteConfigMap(namespace string, name string) error
    22  	ListConfigMaps(namespace string) (*corev1.ConfigMapList, error)
    23  }
    24  
    25  // ConfigMapService is the configMap service implementation using API calls to kubernetes.
    26  type ConfigMapService struct {
    27  	kubeClient      kubernetes.Interface
    28  	logger          log.Logger
    29  	metricsRecorder metrics.Recorder
    30  }
    31  
    32  // NewConfigMapService returns a new ConfigMap KubeService.
    33  func NewConfigMapService(kubeClient kubernetes.Interface, logger log.Logger, metricsRecorder metrics.Recorder) *ConfigMapService {
    34  	logger = logger.With("service", "k8s.configMap")
    35  	return &ConfigMapService{
    36  		kubeClient:      kubeClient,
    37  		logger:          logger,
    38  		metricsRecorder: metricsRecorder,
    39  	}
    40  }
    41  
    42  func (p *ConfigMapService) GetConfigMap(namespace string, name string) (*corev1.ConfigMap, error) {
    43  	configMap, err := p.kubeClient.CoreV1().ConfigMaps(namespace).Get(context.TODO(), name, metav1.GetOptions{})
    44  	recordMetrics(namespace, "ConfigMap", name, "GET", err, p.metricsRecorder)
    45  	if err != nil {
    46  		return nil, err
    47  	}
    48  	return configMap, err
    49  }
    50  
    51  func (p *ConfigMapService) CreateConfigMap(namespace string, configMap *corev1.ConfigMap) error {
    52  	_, err := p.kubeClient.CoreV1().ConfigMaps(namespace).Create(context.TODO(), configMap, metav1.CreateOptions{})
    53  	recordMetrics(namespace, "ConfigMap", configMap.GetName(), "CREATE", err, p.metricsRecorder)
    54  	if err != nil {
    55  		return err
    56  	}
    57  	p.logger.WithField("namespace", namespace).WithField("configMap", configMap.Name).Debugf("configMap created")
    58  	return nil
    59  }
    60  func (p *ConfigMapService) UpdateConfigMap(namespace string, configMap *corev1.ConfigMap) error {
    61  	_, err := p.kubeClient.CoreV1().ConfigMaps(namespace).Update(context.TODO(), configMap, metav1.UpdateOptions{})
    62  	recordMetrics(namespace, "ConfigMap", configMap.GetName(), "UPDATE", err, p.metricsRecorder)
    63  	if err != nil {
    64  		return err
    65  	}
    66  	p.logger.WithField("namespace", namespace).WithField("configMap", configMap.Name).Debugf("configMap updated")
    67  	return nil
    68  }
    69  func (p *ConfigMapService) CreateOrUpdateConfigMap(namespace string, configMap *corev1.ConfigMap) error {
    70  	storedConfigMap, err := p.GetConfigMap(namespace, configMap.Name)
    71  	if err != nil {
    72  		// If no resource we need to create.
    73  		if errors.IsNotFound(err) {
    74  			return p.CreateConfigMap(namespace, configMap)
    75  		}
    76  		return err
    77  	}
    78  
    79  	// Already exists, need to Update.
    80  	// Set the correct resource version to ensure we are on the latest version. This way the only valid
    81  	// namespace is our spec(https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#concurrency-control-and-consistency),
    82  	// we will replace the current namespace state.
    83  	configMap.ResourceVersion = storedConfigMap.ResourceVersion
    84  	return p.UpdateConfigMap(namespace, configMap)
    85  }
    86  
    87  func (p *ConfigMapService) DeleteConfigMap(namespace string, name string) error {
    88  	err := p.kubeClient.CoreV1().ConfigMaps(namespace).Delete(context.TODO(), name, metav1.DeleteOptions{})
    89  	recordMetrics(namespace, "ConfigMap", name, "DELETE", err, p.metricsRecorder)
    90  	return err
    91  }
    92  
    93  func (p *ConfigMapService) ListConfigMaps(namespace string) (*corev1.ConfigMapList, error) {
    94  	objects, err := p.kubeClient.CoreV1().ConfigMaps(namespace).List(context.TODO(), metav1.ListOptions{})
    95  	recordMetrics(namespace, "ConfigMap", metrics.NOT_APPLICABLE, "LIST", err, p.metricsRecorder)
    96  	return objects, err
    97  }