...
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 != "" {
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