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 }