github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/nodeagent/dep/conv/converter.go (about) 1 package conv 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/caos/orbos/internal/operator/nodeagent/dep/kernel" 8 9 "github.com/caos/orbos/internal/operator/nodeagent/dep/health" 10 11 "github.com/caos/orbos/internal/operator/common" 12 "github.com/caos/orbos/internal/operator/nodeagent" 13 "github.com/caos/orbos/internal/operator/nodeagent/dep" 14 "github.com/caos/orbos/internal/operator/nodeagent/dep/cri" 15 "github.com/caos/orbos/internal/operator/nodeagent/dep/hostname" 16 "github.com/caos/orbos/internal/operator/nodeagent/dep/k8s/kubeadm" 17 "github.com/caos/orbos/internal/operator/nodeagent/dep/k8s/kubectl" 18 "github.com/caos/orbos/internal/operator/nodeagent/dep/k8s/kubelet" 19 "github.com/caos/orbos/internal/operator/nodeagent/dep/keepalived" 20 "github.com/caos/orbos/internal/operator/nodeagent/dep/middleware" 21 "github.com/caos/orbos/internal/operator/nodeagent/dep/nginx" 22 "github.com/caos/orbos/internal/operator/nodeagent/dep/sshd" 23 "github.com/caos/orbos/internal/operator/nodeagent/dep/swap" 24 "github.com/caos/orbos/internal/operator/nodeagent/dep/sysctl" 25 "github.com/caos/orbos/mntr" 26 ) 27 28 type Converter interface { 29 Init() func() error 30 Update() error 31 nodeagent.Converter 32 } 33 34 type dependencies struct { 35 ctx context.Context 36 monitor mntr.Monitor 37 os dep.OperatingSystemMajor 38 pm *dep.PackageManager 39 sysd *dep.SystemD 40 cipher string 41 } 42 43 func New(ctx context.Context, monitor mntr.Monitor, os dep.OperatingSystemMajor, cipher string) Converter { 44 return &dependencies{ctx, monitor, os, nil, nil, cipher} 45 } 46 47 func (d *dependencies) Init() func() error { 48 49 d.sysd = dep.NewSystemD(d.monitor) 50 d.pm = dep.NewPackageManager(d.monitor, d.os.OperatingSystem, d.sysd) 51 52 return func() error { 53 if err := d.pm.RefreshInstalled(append(d.InstalledFilter(), 54 "yum-cron", 55 "yum-utils", 56 "yum-plugin-versionlock", 57 "firewalld", 58 )); err != nil { 59 return err 60 } 61 if err := d.pm.Init(); err != nil { 62 return err 63 } 64 sw := d.pm.CurrentVersions("yum-cron") 65 if len(sw) == 0 { 66 return nil 67 } 68 return d.pm.Remove(sw...) 69 } 70 } 71 72 func (d *dependencies) Update() error { 73 return d.pm.Update() 74 } 75 76 func (d *dependencies) InstalledFilter() []string { 77 var query []string 78 for _, dep := range d.ToDependencies(common.Software{}) { 79 query = append(query, dep.Installer.InstalledFilter()...) 80 } 81 return query 82 } 83 84 func (d *dependencies) ToDependencies(sw common.Software) []*nodeagent.Dependency { 85 86 dependencies := []*nodeagent.Dependency{{ 87 Desired: sw.Kernel, 88 Installer: kernel.New(d.ctx, d.monitor, d.pm), 89 }, { 90 Desired: sw.Sysctl, 91 Installer: sysctl.New(d.monitor), 92 }, { 93 Desired: sw.Health, 94 Installer: health.New(d.monitor, d.sysd), 95 }, { 96 Desired: sw.Hostname, 97 Installer: hostname.New(), 98 }, { 99 Desired: sw.Swap, 100 Installer: swap.New("/etc/fstab"), 101 }, { 102 Desired: sw.KeepaliveD, 103 Installer: keepalived.New(d.monitor, d.pm, d.sysd, d.os.OperatingSystem, d.cipher), 104 }, { 105 Desired: sw.SSHD, 106 Installer: sshd.New(d.sysd), 107 }, { 108 Desired: sw.Nginx, 109 Installer: nginx.New(d.monitor, d.pm, d.sysd, d.os.OperatingSystem), 110 }, { 111 Desired: sw.Containerruntime, 112 Installer: cri.New(d.monitor, d.os, d.pm, d.sysd), 113 }, { 114 Desired: sw.Kubelet, 115 Installer: kubelet.New(d.monitor, d.os.OperatingSystem, d.pm, d.sysd), 116 }, { 117 Desired: sw.Kubectl, 118 Installer: kubectl.New(d.os.OperatingSystem, d.pm), 119 }, { 120 Desired: sw.Kubeadm, 121 Installer: kubeadm.New(d.os.OperatingSystem, d.pm), 122 }, 123 } 124 125 for _, dependency := range dependencies { 126 dependency.Installer = middleware.AddLogging(d.monitor, dependency.Installer) 127 } 128 129 return dependencies 130 } 131 132 func (d *dependencies) ToSoftware(dependencies []*nodeagent.Dependency, pkg func(nodeagent.Dependency) common.Package) (sw common.Software) { 133 134 for _, dependency := range dependencies { 135 switch i := middleware.Unwrap(dependency.Installer).(type) { 136 case kernel.Installer: 137 sw.Kernel = pkg(*dependency) 138 case sysctl.Installer: 139 sw.Sysctl = pkg(*dependency) 140 case health.Installer: 141 sw.Health = pkg(*dependency) 142 case hostname.Installer: 143 sw.Hostname = pkg(*dependency) 144 case swap.Installer: 145 sw.Swap = pkg(*dependency) 146 case kubelet.Installer: 147 sw.Kubelet = pkg(*dependency) 148 case kubeadm.Installer: 149 sw.Kubeadm = pkg(*dependency) 150 case kubectl.Installer: 151 sw.Kubectl = pkg(*dependency) 152 case cri.Installer: 153 sw.Containerruntime = pkg(*dependency) 154 case keepalived.Installer: 155 sw.KeepaliveD = pkg(*dependency) 156 case nginx.Installer: 157 sw.Nginx = pkg(*dependency) 158 case sshd.Installer: 159 sw.SSHD = pkg(*dependency) 160 default: 161 panic(fmt.Errorf("no installer type for dependency %s found", i)) 162 } 163 } 164 165 return sw 166 }