github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/core/adapt.go (about)

     1  package core
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"gopkg.in/yaml.v3"
     7  
     8  	"github.com/caos/orbos/mntr"
     9  	"github.com/caos/orbos/pkg/git"
    10  	"github.com/caos/orbos/pkg/kubernetes"
    11  	"github.com/caos/orbos/pkg/kubernetes/resources"
    12  	"github.com/caos/orbos/pkg/secret"
    13  	"github.com/caos/orbos/pkg/tree"
    14  )
    15  
    16  type AdaptFunc func(
    17  	monitor mntr.Monitor,
    18  	desired *tree.Tree,
    19  	current *tree.Tree,
    20  ) (
    21  	QueryFunc,
    22  	DestroyFunc,
    23  	map[string]*secret.Secret,
    24  	map[string]*secret.Existing,
    25  	bool,
    26  	error,
    27  )
    28  
    29  type EnsureFunc func(k8sClient kubernetes.ClientInt) error
    30  
    31  type DestroyFunc func(k8sClient kubernetes.ClientInt) error
    32  
    33  type QueryFunc func(k8sClient kubernetes.ClientInt, queried map[string]interface{}) (EnsureFunc, error)
    34  
    35  func Parse(gitClient *git.Client, file string) (*tree.Tree, error) {
    36  	if err := gitClient.Clone(); err != nil {
    37  		return nil, err
    38  	}
    39  
    40  	tree := &tree.Tree{}
    41  	if err := yaml.Unmarshal(gitClient.Read(file), tree); err != nil {
    42  		return nil, err
    43  	}
    44  
    45  	return tree, nil
    46  }
    47  
    48  func ResourceDestroyToZitadelDestroy(destroyFunc resources.DestroyFunc) DestroyFunc {
    49  	return func(k8sClient kubernetes.ClientInt) error {
    50  		return destroyFunc(k8sClient)
    51  	}
    52  }
    53  
    54  func ResourceQueryToZitadelQuery(queryFunc resources.QueryFunc) QueryFunc {
    55  	return func(k8sClient kubernetes.ClientInt, queried map[string]interface{}) (EnsureFunc, error) {
    56  		ensure, err := queryFunc(k8sClient, queried)
    57  		ensureInternal := ResourceEnsureToZitadelEnsure(ensure)
    58  
    59  		return func(k8sClient kubernetes.ClientInt) error {
    60  			return ensureInternal(k8sClient)
    61  		}, err
    62  	}
    63  }
    64  
    65  func ResourceEnsureToZitadelEnsure(ensureFunc resources.EnsureFunc) EnsureFunc {
    66  	return func(k8sClient kubernetes.ClientInt) error {
    67  		return ensureFunc(k8sClient)
    68  	}
    69  }
    70  func EnsureFuncToQueryFunc(ensure EnsureFunc) QueryFunc {
    71  	return func(k8sClient kubernetes.ClientInt, queried map[string]interface{}) (ensureFunc EnsureFunc, err error) {
    72  		return ensure, err
    73  	}
    74  }
    75  
    76  func QueriersToEnsureFunc(monitor mntr.Monitor, infoLogs bool, queriers []QueryFunc, k8sClient kubernetes.ClientInt, queried map[string]interface{}) (EnsureFunc, error) {
    77  	if infoLogs {
    78  		monitor.Info("querying...")
    79  	} else {
    80  		monitor.Debug("querying...")
    81  	}
    82  	ensurers := make([]EnsureFunc, 0)
    83  	for _, querier := range queriers {
    84  		ensurer, err := querier(k8sClient, queried)
    85  		if err != nil {
    86  			return nil, fmt.Errorf("error while querying:_%w", err)
    87  		}
    88  		ensurers = append(ensurers, ensurer)
    89  	}
    90  	if infoLogs {
    91  		monitor.Info("queried")
    92  	} else {
    93  		monitor.Debug("queried")
    94  	}
    95  	return func(k8sClient kubernetes.ClientInt) error {
    96  		if infoLogs {
    97  			monitor.Info("ensuring...")
    98  		} else {
    99  			monitor.Debug("ensuring...")
   100  		}
   101  		for _, ensurer := range ensurers {
   102  			if err := ensurer(k8sClient); err != nil {
   103  				return fmt.Errorf("error while ensuring: %w", err)
   104  			}
   105  		}
   106  		if infoLogs {
   107  			monitor.Info("ensured")
   108  		} else {
   109  			monitor.Debug("ensured")
   110  		}
   111  		return nil
   112  	}, nil
   113  }
   114  
   115  func DestroyersToDestroyFunc(monitor mntr.Monitor, destroyers []DestroyFunc) DestroyFunc {
   116  	return func(k8sClient kubernetes.ClientInt) error {
   117  		monitor.Info("destroying...")
   118  		for _, destroyer := range destroyers {
   119  			if err := destroyer(k8sClient); err != nil {
   120  				return fmt.Errorf("error while destroying: %w", err)
   121  			}
   122  		}
   123  		monitor.Info("destroyed")
   124  		return nil
   125  	}
   126  }