github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/pkg/kubernetes/resources/funcs.go (about) 1 package resources 2 3 import ( 4 "fmt" 5 6 "github.com/caos/orbos/mntr" 7 "github.com/caos/orbos/pkg/kubernetes" 8 "github.com/caos/orbos/pkg/tree" 9 ) 10 11 type AdaptFuncToEnsure func(monitor mntr.Monitor, desired *tree.Tree, current *tree.Tree) (QueryFunc, error) 12 type AdaptFuncToDelete func(monitor mntr.Monitor, desired *tree.Tree, current *tree.Tree) (DestroyFunc, error) 13 14 type Querier interface { 15 Query(k8sClient kubernetes.ClientInt, queried map[string]interface{}) (EnsureFunc, error) 16 } 17 18 type QueryFunc func(k8sClient kubernetes.ClientInt, queried map[string]interface{}) (EnsureFunc, error) 19 20 func (q QueryFunc) Query(k8sClient kubernetes.ClientInt, queried map[string]interface{}) (EnsureFunc, error) { 21 return q(k8sClient, queried) 22 } 23 24 type Ensurer interface { 25 Ensure(k8sClient kubernetes.ClientInt) error 26 } 27 28 type EnsureFunc func(k8sClient kubernetes.ClientInt) error 29 30 func (e EnsureFunc) Ensure(k8sClient kubernetes.ClientInt) error { 31 return e(k8sClient) 32 } 33 34 type Destroyer interface { 35 Destroy(k8sClient kubernetes.ClientInt) error 36 } 37 38 type DestroyFunc func(k8sClient kubernetes.ClientInt) error 39 40 func (d DestroyFunc) Destroy(k8sClient kubernetes.ClientInt) error { 41 return d(k8sClient) 42 } 43 44 type TestableDestroyer struct { 45 DestroyFunc 46 Arguments interface{} 47 } 48 49 func ToTestableDestroy(destroyFunc DestroyFunc, adapterArguments interface{}) *TestableDestroyer { 50 return &TestableDestroyer{ 51 DestroyFunc: destroyFunc, 52 Arguments: adapterArguments, 53 } 54 } 55 56 type TestableQuerier struct { 57 QueryFunc 58 Arguments interface{} 59 } 60 61 func ToTestableQuerier(queryFunc QueryFunc, adapterArguments interface{}) *TestableQuerier { 62 return &TestableQuerier{ 63 QueryFunc: queryFunc, 64 Arguments: adapterArguments, 65 } 66 } 67 68 func WrapFuncs(monitor mntr.Monitor, query QueryFunc, destroy DestroyFunc) (QueryFunc, DestroyFunc, error) { 69 return func(client kubernetes.ClientInt, queried map[string]interface{}) (ensureFunc EnsureFunc, err error) { 70 monitor.Info("querying...") 71 ensurer, err := query(client, queried) 72 if err != nil { 73 return nil, fmt.Errorf("error while querying: %w", err) 74 } 75 monitor.Info("queried") 76 return func(k8sClient kubernetes.ClientInt) error { 77 monitor.Info("ensuring...") 78 if err := ensurer.Ensure(k8sClient); err != nil { 79 return fmt.Errorf("error while destroying: %w", err) 80 } 81 monitor.Info("ensured") 82 return nil 83 }, nil 84 }, func(client kubernetes.ClientInt) error { 85 monitor.Info("destroying...") 86 err := destroy(client) 87 if err != nil { 88 return fmt.Errorf("error while destroying: %w", err) 89 } 90 monitor.Info("destroyed") 91 return nil 92 }, nil 93 } 94 95 var _ QueriersReducerFunc = QueriersToEnsurer 96 97 type QueriersReducerFunc func(monitor mntr.Monitor, infoLogs bool, queriers []Querier, k8sClient kubernetes.ClientInt, queried map[string]interface{}) (EnsureFunc, error) 98 99 func QueriersToEnsurer(monitor mntr.Monitor, infoLogs bool, queriers []Querier, k8sClient kubernetes.ClientInt, queried map[string]interface{}) (EnsureFunc, error) { 100 if infoLogs { 101 monitor.Info("querying...") 102 } else { 103 monitor.Debug("querying...") 104 } 105 ensurers := make([]EnsureFunc, 0) 106 for _, querier := range queriers { 107 ensurer, err := querier.Query(k8sClient, queried) 108 if err != nil { 109 return nil, fmt.Errorf("error while querying: %w", err) 110 } 111 ensurers = append(ensurers, ensurer) 112 } 113 if infoLogs { 114 monitor.Info("queried") 115 } else { 116 monitor.Debug("queried") 117 } 118 return func(k8sClient kubernetes.ClientInt) error { 119 if infoLogs { 120 monitor.Info("ensuring...") 121 } else { 122 monitor.Debug("ensuring...") 123 } 124 for _, ensurer := range ensurers { 125 if err := ensurer.Ensure(k8sClient); err != nil { 126 return fmt.Errorf("error while ensuring: %w", err) 127 } 128 } 129 if infoLogs { 130 monitor.Info("ensured") 131 } else { 132 monitor.Debug("ensured") 133 } 134 return nil 135 }, nil 136 } 137 138 func ReduceDestroyers(monitor mntr.Monitor, destroyers []Destroyer) DestroyFunc { 139 return func(k8sClient kubernetes.ClientInt) error { 140 monitor.Info("destroying...") 141 for _, destroyer := range destroyers { 142 if err := destroyer.Destroy(k8sClient); err != nil { 143 return fmt.Errorf("error while destroying: %w", err) 144 } 145 } 146 monitor.Info("destroyed") 147 return nil 148 } 149 } 150 151 func DestroyerToQuerier(destroyer Destroyer) QueryFunc { 152 return func(k8sClient kubernetes.ClientInt, queried map[string]interface{}) (ensureFunc EnsureFunc, err error) { 153 return destroyer.Destroy, nil 154 } 155 } 156 157 func DestroyersToQueryFuncs(destroyers []Destroyer) []QueryFunc { 158 queriers := make([]QueryFunc, len(destroyers)) 159 for i, destroyer := range destroyers { 160 queriers[i] = DestroyerToQuerier(destroyer) 161 } 162 return queriers 163 }