...
1 package config
2
3 import (
4 "flag"
5 "fmt"
6 "time"
7
8 "github.com/spf13/afero"
9 corev1 "k8s.io/api/core/v1"
10 "k8s.io/apimachinery/pkg/fields"
11 "k8s.io/apimachinery/pkg/runtime"
12 utilruntime "k8s.io/apimachinery/pkg/util/runtime"
13 clientgoscheme "k8s.io/client-go/kubernetes/scheme"
14 "k8s.io/client-go/rest"
15 "sigs.k8s.io/controller-runtime/pkg/cache"
16 ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
17
18 "edge-infra.dev/pkg/edge/info"
19 kuberetryclient "edge-infra.dev/pkg/sds/lib/k8s/retryclient"
20 kubeclienttypes "edge-infra.dev/pkg/sds/lib/k8s/retryclient/types"
21 )
22
23 type Config struct {
24 KubeRetryClient kubeclienttypes.Retrier
25 Cache cache.Cache
26 Fs afero.Fs
27 }
28
29 func (cf *Config) BindFlags(flags *flag.FlagSet) {
30 flags.StringVar(
31 &info.EdgeConfigMapNS,
32 "edge-configmap-namespace",
33 info.DefaultEdgeConfigMapNS,
34 "Optionally override edge info config map namespace. This is mainly useful for integration tests which run in a shared cluster.",
35 )
36 }
37
38 func New(fs afero.Fs) (*Config, error) {
39 client, err := newKubeClient()
40 if err != nil {
41 return nil, err
42 }
43 reader, err := newKubeReader()
44 if err != nil {
45 return nil, err
46 }
47 cfg := &Config{
48 KubeRetryClient: kuberetryclient.New(client, reader, kuberetryclient.Config{}),
49 Cache: reader,
50 Fs: fs,
51 }
52 return cfg, nil
53 }
54
55
56 func newKubeClient() (ctrlclient.Client, error) {
57 config, err := rest.InClusterConfig()
58 if err != nil {
59 return nil, fmt.Errorf("unable to load in-cluster config: %v", err)
60 }
61
62 opts := ctrlclient.Options{
63 Scheme: createScheme(),
64 }
65 return ctrlclient.New(config, opts)
66 }
67
68
69 func newKubeReader() (cache.Cache, error) {
70 config, err := rest.InClusterConfig()
71 if err != nil {
72 return nil, fmt.Errorf("unable to load in-cluster config: %v", err)
73 }
74 resync := 1 * time.Hour
75 opts := cache.Options{
76 Scheme: createScheme(),
77 SyncPeriod: &resync,
78 ByObject: map[ctrlclient.Object]cache.ByObject{
79 &corev1.ConfigMap{}: {
80 Field: fields.SelectorFromSet(fields.Set{
81 "metadata.name": info.EdgeConfigMapName,
82 "metadata.namespace": info.EdgeConfigMapNS,
83 }),
84 },
85 },
86 }
87 return cache.New(config, opts)
88 }
89
90
91 func createScheme() *runtime.Scheme {
92 scheme := runtime.NewScheme()
93 utilruntime.Must(clientgoscheme.AddToScheme(scheme))
94 return scheme
95 }
96
View as plain text