mirror of
https://github.com/go-micro/go-micro.git
synced 2025-04-04 20:44:27 +02:00
119 lines
2.3 KiB
Go
119 lines
2.3 KiB
Go
// Package configmap config is an interface for dynamic configuration.
|
|
package configmap
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"go-micro.dev/v4/config/source"
|
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/client-go/kubernetes"
|
|
)
|
|
|
|
type configmap struct {
|
|
opts source.Options
|
|
client *kubernetes.Clientset
|
|
cerr error
|
|
name string
|
|
namespace string
|
|
configPath string
|
|
}
|
|
|
|
// Predefined variables
|
|
var (
|
|
DefaultName = "micro"
|
|
DefaultConfigPath = ""
|
|
DefaultNamespace = "default"
|
|
)
|
|
|
|
func (k *configmap) Read() (*source.ChangeSet, error) {
|
|
if k.cerr != nil {
|
|
return nil, k.cerr
|
|
}
|
|
|
|
cmp, err := k.client.CoreV1().ConfigMaps(k.namespace).Get(context.TODO(), k.name, v1.GetOptions{})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
data := makeMap(cmp.Data)
|
|
|
|
b, err := k.opts.Encoder.Encode(data)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error reading source: %v", err)
|
|
}
|
|
|
|
cs := &source.ChangeSet{
|
|
Format: k.opts.Encoder.String(),
|
|
Source: k.String(),
|
|
Data: b,
|
|
Timestamp: cmp.CreationTimestamp.Time,
|
|
}
|
|
cs.Checksum = cs.Sum()
|
|
|
|
return cs, nil
|
|
}
|
|
|
|
// Write is unsupported
|
|
func (k *configmap) Write(cs *source.ChangeSet) error {
|
|
return nil
|
|
}
|
|
|
|
func (k *configmap) String() string {
|
|
return "configmap"
|
|
}
|
|
|
|
func (k *configmap) Watch() (source.Watcher, error) {
|
|
if k.cerr != nil {
|
|
return nil, k.cerr
|
|
}
|
|
|
|
w, err := newWatcher(k.name, k.namespace, k.client, k.opts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return w, nil
|
|
}
|
|
|
|
// NewSource is a factory function
|
|
func NewSource(opts ...source.Option) source.Source {
|
|
var (
|
|
options = source.NewOptions(opts...)
|
|
name = DefaultName
|
|
configPath = DefaultConfigPath
|
|
namespace = DefaultNamespace
|
|
)
|
|
|
|
prefix, ok := options.Context.Value(prefixKey{}).(string)
|
|
if ok {
|
|
name = prefix
|
|
}
|
|
|
|
cfg, ok := options.Context.Value(configPathKey{}).(string)
|
|
if ok {
|
|
configPath = cfg
|
|
}
|
|
|
|
sname, ok := options.Context.Value(nameKey{}).(string)
|
|
if ok {
|
|
name = sname
|
|
}
|
|
|
|
ns, ok := options.Context.Value(namespaceKey{}).(string)
|
|
if ok {
|
|
namespace = ns
|
|
}
|
|
|
|
// TODO handle if the client fails what to do current return does not support error
|
|
client, err := getClient(configPath)
|
|
|
|
return &configmap{
|
|
cerr: err,
|
|
client: client,
|
|
opts: options,
|
|
name: name,
|
|
configPath: configPath,
|
|
namespace: namespace,
|
|
}
|
|
}
|