github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/orbiter/kinds/providers/static/adapt.go (about) 1 package static 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/loadbalancers" 9 "github.com/caos/orbos/internal/operator/orbiter/kinds/loadbalancers/dynamic" 10 "github.com/caos/orbos/internal/operator/orbiter/kinds/providers/core" 11 "github.com/caos/orbos/internal/ssh" 12 "github.com/caos/orbos/mntr" 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 AdaptFunc( 19 id string, 20 whitelist dynamic.WhiteListFunc, 21 orbiterCommit, 22 repoURL, 23 repoKey string, 24 pprof bool, 25 ) orbiter.AdaptFunc { 26 return func(monitor mntr.Monitor, finishedChan chan struct{}, desiredTree *tree.Tree, currentTree *tree.Tree) (queryFunc orbiter.QueryFunc, destroyFunc orbiter.DestroyFunc, configureFunc orbiter.ConfigureFunc, migrate bool, secrets map[string]*secret.Secret, err error) { 27 defer func() { 28 if err != nil { 29 err = fmt.Errorf("building %s failed: %w", desiredTree.Common.Kind, err) 30 } 31 }() 32 desiredKind, err := parseDesiredV0(desiredTree) 33 if err != nil { 34 return nil, nil, nil, migrate, nil, fmt.Errorf("parsing desired state failed: %w", err) 35 } 36 desiredTree.Parsed = desiredKind 37 secrets = make(map[string]*secret.Secret, 0) 38 secret.AppendSecrets("", secrets, getSecretsMap(desiredKind), nil, nil) 39 40 if desiredKind.Spec.Verbose && !monitor.IsVerbose() { 41 monitor = monitor.Verbose() 42 } 43 44 if desiredKind.Spec.ExternalInterfaces == nil { 45 desiredKind.Spec.ExternalInterfaces = make([]string, 0) 46 migrate = true 47 } 48 49 if desiredKind.Spec.PrivateInterface == "" { 50 desiredKind.Spec.PrivateInterface = "eth0" 51 migrate = true 52 } 53 54 if err := desiredKind.validateAdapt(); err != nil { 55 return nil, nil, nil, migrate, nil, err 56 } 57 58 lbCurrent := &tree.Tree{} 59 var lbQuery orbiter.QueryFunc 60 61 lbQuery, lbDestroy, lbConfigure, migrateLocal, lbsecrets, err := loadbalancers.GetQueryAndDestroyFunc(monitor, whitelist, desiredKind.Loadbalancing, lbCurrent, finishedChan) 62 if err != nil { 63 return nil, nil, nil, migrate, nil, err 64 } 65 if migrateLocal { 66 migrate = true 67 } 68 secret.AppendSecrets("", secrets, lbsecrets, nil, nil) 69 70 current := &Current{ 71 Common: tree.NewCommon("orbiter.caos.ch/StaticProvider", "v0", false), 72 } 73 current.Current.privateInterface = desiredKind.Spec.PrivateInterface 74 currentTree.Parsed = current 75 76 svc := NewMachinesService(monitor, desiredKind, id) 77 return func(nodeAgentsCurrent *common.CurrentNodeAgents, nodeAgentsDesired *common.DesiredNodeAgents, _ map[string]interface{}) (ensureFunc orbiter.EnsureFunc, err error) { 78 defer func() { 79 if err != nil { 80 err = fmt.Errorf("querying %s failed: %w", desiredKind.Common.Kind, err) 81 } 82 }() 83 84 if err := desiredKind.validateQuery(); err != nil { 85 return nil, err 86 } 87 88 if _, err := lbQuery(nodeAgentsCurrent, nodeAgentsDesired, nil); err != nil { 89 return nil, err 90 } 91 92 if err := svc.updateKeys(); err != nil { 93 return nil, err 94 } 95 _, iterateNA := core.NodeAgentFuncs(monitor, repoURL, repoKey, pprof) 96 return query(desiredKind, current, nodeAgentsDesired, nodeAgentsCurrent, lbCurrent.Parsed, monitor, svc, iterateNA, orbiterCommit) 97 }, func(delegates map[string]interface{}) error { 98 if err := lbDestroy(delegates); err != nil { 99 return err 100 } 101 102 if err := svc.updateKeys(); err != nil { 103 return err 104 } 105 106 return destroy(svc, desiredKind, current) 107 }, func(orb orbcfg.Orb) error { 108 if err := lbConfigure(orb); err != nil { 109 return err 110 } 111 112 initKeys := desiredKind.Spec.Keys == nil 113 if initKeys || 114 desiredKind.Spec.Keys.MaintenanceKeyPrivate == nil || desiredKind.Spec.Keys.MaintenanceKeyPrivate.Value == "" || 115 desiredKind.Spec.Keys.MaintenanceKeyPublic == nil || desiredKind.Spec.Keys.MaintenanceKeyPublic.Value == "" { 116 if initKeys { 117 desiredKind.Spec.Keys = &Keys{} 118 } 119 priv, pub := ssh.Generate() 120 desiredKind.Spec.Keys.MaintenanceKeyPrivate = &secret.Secret{Value: priv} 121 desiredKind.Spec.Keys.MaintenanceKeyPublic = &secret.Secret{Value: pub} 122 return nil 123 } 124 125 return core.ConfigureNodeAgents(svc, monitor, orb, pprof) 126 }, 127 migrate, 128 secrets, 129 nil 130 } 131 }