...
1 package thinclient
2
3 import (
4 "context"
5 "encoding/json"
6
7 corev1 "k8s.io/api/core/v1"
8 ctrl "sigs.k8s.io/controller-runtime"
9 "sigs.k8s.io/controller-runtime/pkg/client"
10
11 "edge-infra.dev/pkg/sds"
12 "edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/config"
13 "edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/plugins/thinclient/selector"
14 "edge-infra.dev/pkg/sds/lib/os/file"
15 "edge-infra.dev/pkg/sds/lib/os/passthrough"
16 )
17
18 var (
19 configMapObjectType = "ConfigMap"
20
21 thinclientConfigMapField = "config.json"
22 )
23
24 type Configuration struct {
25 Selectors selector.Selectors `json:"selectors"`
26 }
27
28 type ConfigurationPlugin struct{}
29
30 func (thinclientPlugin ConfigurationPlugin) Reconcile(ctx context.Context, object client.Object, conf config.Config) error {
31 log := ctrl.LoggerFrom(ctx)
32 configMap, ok := object.(*corev1.ConfigMap)
33 if !ok {
34 return nil
35 }
36
37 if !isThinclientConfigurationConfigMap(configMap, conf) {
38 return nil
39 }
40
41 selectors, err := getSelectorsFromThinclientConfiguration(configMap)
42 if err != nil {
43 log.Error(err, "failed to get selectors for object")
44 return err
45 }
46
47 rootPath, err := conf.GetRootPath(ctx)
48 if err != nil {
49 log.Error(err, "failed to get host root path")
50 return err
51 }
52 if err = updateTargetObjects(ctx, selectors, conf, file.New(), passthrough.New(rootPath)); err != nil {
53 log.Error(err, "failed to update target objects for selectors")
54 return err
55 }
56 return nil
57 }
58
59 func isThinclientConfigurationConfigMap(configMap *corev1.ConfigMap, cfg config.Config) bool {
60 name := cfg.GetFlags().ThinclientConfigMap
61 return configMap.GetNamespace() == sds.Namespace && name != nil && configMap.GetName() == *name
62 }
63
64
65 func getSelectorsFromThinclientConfiguration(thinclientConfiguration *corev1.ConfigMap) (selector.Selectors, error) {
66 configJSON := thinclientConfiguration.Data[thinclientConfigMapField]
67 config := &Configuration{}
68 if err := json.Unmarshal([]byte(configJSON), config); err != nil {
69 return nil, err
70 }
71 selectors := config.Selectors
72 for idx, selector := range selectors {
73 if selector.Type == "" {
74 selectors[idx].Type = configMapObjectType
75 }
76 }
77 return selectors, nil
78 }
79
80 func updateTargetObjects(ctx context.Context, selectors selector.Selectors, conf config.Config, fileHandler file.File, passthrough passthrough.Exec) error {
81 for _, selector := range selectors {
82 configObjects, err := selector.GetTargetConfigObjects(ctx, conf)
83 if err != nil {
84 return err
85 }
86 for _, configObject := range configObjects {
87 if err = configObject.Update(selector.Directory, selector.Service, fileHandler, passthrough); err != nil {
88 return err
89 }
90 }
91 }
92 return nil
93 }
94
View as plain text