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 }