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  }