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  }