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

     1  package orb
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/caos/orbos/internal/operator/common"
     7  	"github.com/caos/orbos/internal/operator/orbiter"
     8  	"github.com/caos/orbos/internal/operator/orbiter/kinds/clusters"
     9  	"github.com/caos/orbos/internal/operator/orbiter/kinds/providers"
    10  	"github.com/caos/orbos/mntr"
    11  	"github.com/caos/orbos/pkg/git"
    12  	"github.com/caos/orbos/pkg/labels"
    13  	orbcfg "github.com/caos/orbos/pkg/orb"
    14  	"github.com/caos/orbos/pkg/secret"
    15  	"github.com/caos/orbos/pkg/tree"
    16  )
    17  
    18  func OperatorSelector() *labels.Selector {
    19  	return labels.OpenOperatorSelector("ORBOS", "orbiter.caos.ch")
    20  }
    21  
    22  func AdaptFunc(
    23  	operatorLabels *labels.Operator,
    24  	orbConfig *orbcfg.Orb,
    25  	orbiterCommit string,
    26  	oneoff bool,
    27  	deployOrbiter bool,
    28  	gitClient *git.Client,
    29  ) orbiter.AdaptFunc {
    30  	return func(
    31  		monitor mntr.Monitor,
    32  		finishedChan chan struct{},
    33  		desiredTree *tree.Tree,
    34  		currentTree *tree.Tree,
    35  	) (
    36  		queryFunc orbiter.QueryFunc,
    37  		destroyFunc orbiter.DestroyFunc,
    38  		configureFunc orbiter.ConfigureFunc,
    39  		migrate bool,
    40  		secrets map[string]*secret.Secret,
    41  		err error,
    42  	) {
    43  		defer func() {
    44  			if err != nil {
    45  				err = fmt.Errorf("building %s failed: %w", desiredTree.Common.Kind, err)
    46  			}
    47  		}()
    48  
    49  		desiredKind, err := ParseDesiredV0(desiredTree)
    50  		if err != nil {
    51  			return nil, nil, nil, migrate, nil, fmt.Errorf("parsing desired state failed: %w", err)
    52  		}
    53  		desiredTree.Parsed = desiredKind
    54  		secrets = make(map[string]*secret.Secret, 0)
    55  
    56  		if err := desiredKind.validate(); err != nil {
    57  			return nil, nil, nil, migrate, nil, err
    58  		}
    59  
    60  		if desiredKind.Spec.Verbose && !monitor.IsVerbose() {
    61  			monitor = monitor.Verbose()
    62  		}
    63  
    64  		providerCurrents := make(map[string]*tree.Tree)
    65  		providerQueriers := make([]orbiter.QueryFunc, 0)
    66  		providerDestroyers := make([]orbiter.DestroyFunc, 0)
    67  		providerConfigurers := make([]orbiter.ConfigureFunc, 0)
    68  
    69  		whitelistChan := make(chan []*orbiter.CIDR)
    70  
    71  		orbID, err := orbConfig.ID()
    72  		if err != nil {
    73  			panic(err)
    74  		}
    75  
    76  		for provID, providerTree := range desiredKind.Providers {
    77  
    78  			providerCurrent := &tree.Tree{}
    79  			providerCurrents[provID] = providerCurrent
    80  
    81  			//			providermonitor := monitor.WithFields(map[string]interface{}{
    82  			//				"provider": provID,
    83  			//			})
    84  
    85  			//			providerID := id + provID
    86  			query, destroy, configure, migrateLocal, providerSecrets, err := providers.GetQueryAndDestroyFuncs(
    87  				monitor,
    88  				provID,
    89  				providerTree,
    90  				providerCurrent,
    91  				whitelistChan,
    92  				finishedChan,
    93  				orbiterCommit,
    94  				orbID,
    95  				orbConfig.URL,
    96  				orbConfig.Repokey,
    97  				oneoff,
    98  				desiredKind.Spec.PProf,
    99  			)
   100  			if err != nil {
   101  				return nil, nil, nil, migrate, nil, err
   102  			}
   103  
   104  			if migrateLocal {
   105  				migrate = true
   106  			}
   107  
   108  			providerQueriers = append(providerQueriers, query)
   109  			providerDestroyers = append(providerDestroyers, destroy)
   110  			providerConfigurers = append(providerConfigurers, configure)
   111  			secret.AppendSecrets(provID, secrets, providerSecrets, nil, nil)
   112  		}
   113  
   114  		var provCurr map[string]interface{}
   115  		destroyProviders := func(delegatedFromClusters map[string]interface{}) (map[string]interface{}, error) {
   116  			if provCurr != nil {
   117  				return provCurr, nil
   118  			}
   119  
   120  			provCurr = make(map[string]interface{})
   121  			for _, destroyer := range providerDestroyers {
   122  				if err := destroyer(delegatedFromClusters); err != nil {
   123  					return nil, err
   124  				}
   125  			}
   126  
   127  			for currKey, currVal := range providerCurrents {
   128  				provCurr[currKey] = currVal.Parsed
   129  			}
   130  			return provCurr, nil
   131  		}
   132  
   133  		clusterCurrents := make(map[string]*tree.Tree)
   134  		clusterQueriers := make([]orbiter.QueryFunc, 0)
   135  		clusterDestroyers := make([]orbiter.DestroyFunc, 0)
   136  		clusterConfigurers := make([]orbiter.ConfigureFunc, 0)
   137  		for clusterID, clusterTree := range desiredKind.Clusters {
   138  
   139  			clusterCurrent := &tree.Tree{}
   140  			clusterCurrents[clusterID] = clusterCurrent
   141  			query, destroy, configure, migrateLocal, clusterSecrets, err := clusters.GetQueryAndDestroyFuncs(
   142  				monitor,
   143  				operatorLabels,
   144  				clusterID,
   145  				clusterTree,
   146  				oneoff,
   147  				desiredKind.Spec.PProf,
   148  				deployOrbiter,
   149  				clusterCurrent,
   150  				destroyProviders,
   151  				whitelistChan,
   152  				finishedChan,
   153  				gitClient,
   154  			)
   155  			if err != nil {
   156  				return nil, nil, nil, migrate, nil, err
   157  			}
   158  			clusterQueriers = append(clusterQueriers, query)
   159  			clusterDestroyers = append(clusterDestroyers, destroy)
   160  			clusterConfigurers = append(clusterConfigurers, configure)
   161  			secret.AppendSecrets(clusterID, secrets, clusterSecrets, nil, nil)
   162  			if migrateLocal {
   163  				migrate = true
   164  			}
   165  		}
   166  
   167  		currentTree.Parsed = &Current{
   168  			Common:    tree.NewCommon("orbiter.caos.ch/Orb", "v0", false),
   169  			Clusters:  clusterCurrents,
   170  			Providers: providerCurrents,
   171  		}
   172  
   173  		return func(nodeAgentsCurrent *common.CurrentNodeAgents, nodeAgentsDesired *common.DesiredNodeAgents, _ map[string]interface{}) (ensureFunc orbiter.EnsureFunc, err error) {
   174  
   175  				providerEnsurers := make([]orbiter.EnsureFunc, 0)
   176  				queriedProviders := make(map[string]interface{})
   177  				for _, querier := range providerQueriers {
   178  					ensurer, err := querier(nodeAgentsCurrent, nodeAgentsDesired, nil)
   179  
   180  					if err != nil {
   181  						return nil, err
   182  					}
   183  					providerEnsurers = append(providerEnsurers, ensurer)
   184  				}
   185  
   186  				for currKey, currVal := range providerCurrents {
   187  					queriedProviders[currKey] = currVal.Parsed
   188  				}
   189  
   190  				clusterEnsurers := make([]orbiter.EnsureFunc, 0)
   191  				for _, querier := range clusterQueriers {
   192  					ensurer, err := querier(nodeAgentsCurrent, nodeAgentsDesired, queriedProviders)
   193  
   194  					if err != nil {
   195  						return nil, err
   196  					}
   197  					clusterEnsurers = append(clusterEnsurers, ensurer)
   198  				}
   199  
   200  				return func(psf func(monitor mntr.Monitor) error) *orbiter.EnsureResult {
   201  					defer func() {
   202  						if err != nil {
   203  							err = fmt.Errorf("ensuring %s failed: %w", desiredKind.Common.Kind, err)
   204  						}
   205  					}()
   206  
   207  					done := true
   208  					for _, ensurer := range append(providerEnsurers, clusterEnsurers...) {
   209  						result := ensurer(psf)
   210  						if result.Err != nil {
   211  							return result
   212  						}
   213  						if !result.Done {
   214  							done = false
   215  						}
   216  					}
   217  
   218  					return orbiter.ToEnsureResult(done, nil)
   219  				}, nil
   220  			}, func(delegates map[string]interface{}) error {
   221  				defer func() {
   222  					if err != nil {
   223  						err = fmt.Errorf("destroying %s failed: %w", desiredKind.Common.Kind, err)
   224  					}
   225  				}()
   226  
   227  				for _, destroyer := range clusterDestroyers {
   228  					if err := destroyer(delegates); err != nil {
   229  						return err
   230  					}
   231  				}
   232  				return nil
   233  			}, func(orb orbcfg.Orb) error {
   234  				defer func() {
   235  					if err != nil {
   236  						err = fmt.Errorf("ensuring %s failed: %w", desiredKind.Common.Kind, err)
   237  					}
   238  				}()
   239  
   240  				for _, configure := range append(providerConfigurers, clusterConfigurers...) {
   241  					if err := configure(orb); err != nil {
   242  						return err
   243  					}
   244  				}
   245  				return nil
   246  			},
   247  			migrate,
   248  			secrets,
   249  			nil
   250  	}
   251  }