package thinclient import ( "context" "encoding/json" corev1 "k8s.io/api/core/v1" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "edge-infra.dev/pkg/sds" "edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/config" "edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/plugins/thinclient/selector" "edge-infra.dev/pkg/sds/lib/os/file" "edge-infra.dev/pkg/sds/lib/os/passthrough" ) var ( configMapObjectType = "ConfigMap" thinclientConfigMapField = "config.json" ) type Configuration struct { Selectors selector.Selectors `json:"selectors"` } type ConfigurationPlugin struct{} func (thinclientPlugin ConfigurationPlugin) Reconcile(ctx context.Context, object client.Object, conf config.Config) error { log := ctrl.LoggerFrom(ctx) configMap, ok := object.(*corev1.ConfigMap) if !ok { return nil } if !isThinclientConfigurationConfigMap(configMap, conf) { return nil } selectors, err := getSelectorsFromThinclientConfiguration(configMap) if err != nil { log.Error(err, "failed to get selectors for object") return err } rootPath, err := conf.GetRootPath(ctx) if err != nil { log.Error(err, "failed to get host root path") return err } if err = updateTargetObjects(ctx, selectors, conf, file.New(), passthrough.New(rootPath)); err != nil { log.Error(err, "failed to update target objects for selectors") return err } return nil } func isThinclientConfigurationConfigMap(configMap *corev1.ConfigMap, cfg config.Config) bool { name := cfg.GetFlags().ThinclientConfigMap return configMap.GetNamespace() == sds.Namespace && name != nil && configMap.GetName() == *name } // Parse the JSON data into Selectors (list of Selector structs) func getSelectorsFromThinclientConfiguration(thinclientConfiguration *corev1.ConfigMap) (selector.Selectors, error) { configJSON := thinclientConfiguration.Data[thinclientConfigMapField] config := &Configuration{} if err := json.Unmarshal([]byte(configJSON), config); err != nil { return nil, err } selectors := config.Selectors for idx, selector := range selectors { if selector.Type == "" { selectors[idx].Type = configMapObjectType } } return selectors, nil } func updateTargetObjects(ctx context.Context, selectors selector.Selectors, conf config.Config, fileHandler file.File, passthrough passthrough.Exec) error { for _, selector := range selectors { configObjects, err := selector.GetTargetConfigObjects(ctx, conf) if err != nil { return err } for _, configObject := range configObjects { if err = configObject.Update(selector.Directory, selector.Service, fileHandler, passthrough); err != nil { return err } } } return nil }