github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/secret/operators/operators.go (about)

     1  package operators
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  
     8  	"github.com/caos/orbos/internal/operator/boom/api/latest"
     9  
    10  	orbiterOrb "github.com/caos/orbos/internal/operator/orbiter/kinds/orb"
    11  	"github.com/caos/orbos/pkg/labels"
    12  
    13  	boomcrd "github.com/caos/orbos/internal/api/boom"
    14  	nwcrd "github.com/caos/orbos/internal/api/networking"
    15  	boomapi "github.com/caos/orbos/internal/operator/boom/api"
    16  	nwOrb "github.com/caos/orbos/internal/operator/networking/kinds/orb"
    17  	"github.com/caos/orbos/mntr"
    18  	"github.com/caos/orbos/pkg/git"
    19  	"github.com/caos/orbos/pkg/kubernetes"
    20  	orbcfg "github.com/caos/orbos/pkg/orb"
    21  	"github.com/caos/orbos/pkg/secret"
    22  	"github.com/caos/orbos/pkg/tree"
    23  )
    24  
    25  func GetAllSecretsFunc(
    26  	monitor mntr.Monitor,
    27  	printLogs,
    28  	gitops bool,
    29  	gitClient *git.Client,
    30  	k8sClient kubernetes.ClientInt,
    31  	orb *orbcfg.Orb,
    32  ) func() (
    33  	map[string]*secret.Secret,
    34  	map[string]*secret.Existing,
    35  	map[string]*tree.Tree,
    36  	error,
    37  ) {
    38  	return func() (
    39  		map[string]*secret.Secret,
    40  		map[string]*secret.Existing,
    41  		map[string]*tree.Tree,
    42  		error,
    43  	) {
    44  		return getAllSecrets(monitor, printLogs, gitops, gitClient, k8sClient, orb)
    45  	}
    46  }
    47  
    48  func getAllSecrets(
    49  	monitor mntr.Monitor,
    50  	printLogs,
    51  	gitops bool,
    52  	gitClient *git.Client,
    53  	k8sClient kubernetes.ClientInt,
    54  	orb *orbcfg.Orb,
    55  ) (
    56  	map[string]*secret.Secret,
    57  	map[string]*secret.Existing,
    58  	map[string]*tree.Tree,
    59  	error,
    60  ) {
    61  
    62  	allSecrets := make(map[string]*secret.Secret, 0)
    63  	allExisting := make(map[string]*secret.Existing, 0)
    64  	allTrees := make(map[string]*tree.Tree, 0)
    65  
    66  	if err := secret.GetOperatorSecrets(
    67  		monitor,
    68  		printLogs,
    69  		gitops,
    70  		gitClient,
    71  		git.BoomFile,
    72  		allTrees,
    73  		allSecrets,
    74  		allExisting,
    75  		func() (*tree.Tree, error) { return boomcrd.ReadCRD(k8sClient) },
    76  		func(t *tree.Tree) (map[string]*secret.Secret, map[string]*secret.Existing, bool, error) {
    77  			toolset, migrate, _, _, err := boomapi.ParseToolset(t)
    78  			if err != nil {
    79  				return nil, nil, false, err
    80  			}
    81  			boomSecrets, boomExistingSecrets := latest.GetSecretsMap(toolset)
    82  			return boomSecrets, boomExistingSecrets, migrate, nil
    83  		},
    84  	); err != nil {
    85  		return nil, nil, nil, err
    86  	}
    87  
    88  	if gitops {
    89  		if err := secret.GetOperatorSecrets(
    90  			monitor,
    91  			printLogs,
    92  			gitops,
    93  			gitClient,
    94  			git.OrbiterFile,
    95  			allTrees,
    96  			allSecrets,
    97  			allExisting,
    98  			func() (*tree.Tree, error) { return nil, errors.New("ORBITER doesn't support crd mode") },
    99  			func(t *tree.Tree) (map[string]*secret.Secret, map[string]*secret.Existing, bool, error) {
   100  				_, _, _, migrate, orbiterSecrets, err := orbiterOrb.AdaptFunc(
   101  					labels.NoopOperator("ORBOS"),
   102  					orb,
   103  					"",
   104  					true,
   105  					false,
   106  					gitClient,
   107  				)(monitor, make(chan struct{}), t, &tree.Tree{})
   108  				return orbiterSecrets, nil, migrate, err
   109  			},
   110  		); err != nil {
   111  			return nil, nil, nil, err
   112  		}
   113  	}
   114  
   115  	if err := secret.GetOperatorSecrets(
   116  		monitor,
   117  		printLogs,
   118  		gitops,
   119  		gitClient,
   120  		git.NetworkingFile,
   121  		allTrees,
   122  		allSecrets,
   123  		allExisting,
   124  		func() (*tree.Tree, error) { return nwcrd.ReadCRD(k8sClient) },
   125  		func(t *tree.Tree) (map[string]*secret.Secret, map[string]*secret.Existing, bool, error) {
   126  			_, _, nwSecrets, nwExisting, migrate, err := nwOrb.AdaptFunc(nil, nil, false)(monitor, t, nil)
   127  			return nwSecrets, nwExisting, migrate, err
   128  		},
   129  	); err != nil {
   130  		return nil, nil, nil, err
   131  	}
   132  
   133  	if len(allSecrets) == 0 && len(allExisting) == 0 {
   134  		return nil, nil, nil, mntr.ToUserError(errors.New("couldn't find any secrets"))
   135  	}
   136  
   137  	return allSecrets, allExisting, allTrees, nil
   138  }
   139  
   140  func PushFunc(
   141  	monitor mntr.Monitor,
   142  	gitops bool,
   143  	gitClient *git.Client,
   144  	k8sClient kubernetes.ClientInt,
   145  ) func(
   146  	trees map[string]*tree.Tree,
   147  	path string,
   148  ) error {
   149  	return func(
   150  		trees map[string]*tree.Tree,
   151  		path string,
   152  	) error {
   153  		return push(monitor, gitops, gitClient, k8sClient, trees, path)
   154  	}
   155  }
   156  
   157  func push(
   158  	monitor mntr.Monitor,
   159  	gitops bool,
   160  	gitClient *git.Client,
   161  	k8sClient kubernetes.ClientInt,
   162  	trees map[string]*tree.Tree,
   163  	path string,
   164  ) error {
   165  	var (
   166  		applyCRDFunc func(*tree.Tree) error
   167  		desiredFile  git.DesiredFile
   168  	)
   169  	if strings.HasPrefix(path, git.OrbiterFile.WOExtension()) {
   170  		desiredFile = git.OrbiterFile
   171  		applyCRDFunc = func(t *tree.Tree) error {
   172  			panic(errors.New("ORBITER doesn't support CRD mode"))
   173  		}
   174  	} else if strings.HasPrefix(path, git.BoomFile.WOExtension()) {
   175  		desiredFile = git.BoomFile
   176  		applyCRDFunc = func(t *tree.Tree) error {
   177  			return boomcrd.WriteCrd(k8sClient, t)
   178  		}
   179  	} else if strings.HasPrefix(path, git.NetworkingFile.WOExtension()) {
   180  		desiredFile = git.NetworkingFile
   181  		applyCRDFunc = func(t *tree.Tree) error {
   182  			return nwcrd.WriteCrd(k8sClient, t)
   183  		}
   184  	} else {
   185  		return errors.New("operator unknown")
   186  	}
   187  
   188  	desired, found := trees[desiredFile.WOExtension()]
   189  	if !found {
   190  		return mntr.ToUserError(fmt.Errorf("desired state not found for %s", desiredFile.WOExtension()))
   191  	}
   192  
   193  	if gitops {
   194  		return gitClient.PushDesiredFunc(desiredFile, desired)(monitor)
   195  	}
   196  	return applyCRDFunc(desired)
   197  }