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 }