...

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

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

     1  package configobject
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"io/fs"
     7  	"path/filepath"
     8  
     9  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    10  	"k8s.io/apimachinery/pkg/fields"
    11  	"k8s.io/apimachinery/pkg/labels"
    12  	"k8s.io/apimachinery/pkg/runtime"
    13  
    14  	"edge-infra.dev/pkg/sds/lib/os/file"
    15  	"edge-infra.dev/pkg/sds/lib/os/passthrough"
    16  )
    17  
    18  var (
    19  	fileMode = fs.FileMode(0644)
    20  
    21  	errCouldNotCastToSecretType = errors.New("could not cast object to Secret type")
    22  )
    23  
    24  type ConfigObject interface {
    25  	metav1.Object
    26  	runtime.Object
    27  
    28  	ObjectType() string
    29  	GetFiles() map[string][]byte
    30  	GetLabelsSet() labels.Set
    31  	GetFieldsSet() (fields.Set, error)
    32  	Update(directory string, service string, fileHandler file.File, passthrough passthrough.Exec) error
    33  	UpdateFiles(directory string, fileHandler file.File) (bool, error)
    34  }
    35  
    36  func getFieldsSetFromConfigObject(configObject ConfigObject) (fields.Set, error) {
    37  	objectFields := fields.Set{"metadata.name": configObject.GetName(), "metadata.namespace": configObject.GetNamespace()}
    38  	if configObject.ObjectType() == secretObjectType {
    39  		secret, ok := configObject.(*Secret)
    40  		if !ok {
    41  			return nil, errCouldNotCastToSecretType
    42  		}
    43  		objectFields["type"] = secret.SecretType()
    44  	}
    45  	return objectFields, nil
    46  }
    47  
    48  func updateConfigObject(configObject ConfigObject, directory string, service string, fileHandler file.File, passthrough passthrough.Exec) error {
    49  	updated, err := configObject.UpdateFiles(directory, fileHandler)
    50  	if err != nil {
    51  		return err
    52  	}
    53  	if updated && service != "" { // only restart services if files have changed
    54  		_, err := passthrough.CombinedOutput("/usr/bin/systemctl", "restart", service)
    55  		return err
    56  	}
    57  	return nil
    58  }
    59  
    60  func updateConfigObjectFiles(configObject ConfigObject, directory string, fileHandler file.File) (bool, error) {
    61  	directory = filepath.Clean(directory)
    62  	updated := false
    63  	for filename, updatedData := range configObject.GetFiles() {
    64  		path := filepath.Join(directory, filename)
    65  		needsUpdating, err := fileNeedsUpdating(path, updatedData, fileHandler)
    66  		if err != nil {
    67  			return false, err
    68  		}
    69  		if needsUpdating {
    70  			if err := fileHandler.Write(path, updatedData, fileMode); err != nil {
    71  				return false, err
    72  			}
    73  			updated = true
    74  		}
    75  	}
    76  	return updated, nil
    77  }
    78  
    79  func fileNeedsUpdating(path string, updatedData []byte, fileHandler file.File) (bool, error) {
    80  	if !fileHandler.Exists(path) {
    81  		return true, nil
    82  	}
    83  	currentData, err := fileHandler.Read(path)
    84  	if err != nil {
    85  		return false, err
    86  	}
    87  	return !bytes.Equal(currentData, updatedData), nil
    88  }
    89  

View as plain text