...

Source file src/edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/plugins/thinclient/thinclient.go

Documentation: edge-infra.dev/pkg/sds/ien/k8s/controllers/nodeagent/plugins/thinclient

     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  // Parse the JSON data into Selectors (list of Selector structs)
    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