github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/nodeagent/dep/k8s/kubelet/dep.go (about)

     1  package kubelet
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"os"
     7  	"os/exec"
     8  	"strings"
     9  
    10  	"github.com/caos/orbos/internal/operator/common"
    11  	"github.com/caos/orbos/internal/operator/nodeagent"
    12  	"github.com/caos/orbos/internal/operator/nodeagent/dep"
    13  	"github.com/caos/orbos/internal/operator/nodeagent/dep/k8s"
    14  	"github.com/caos/orbos/internal/operator/nodeagent/dep/middleware"
    15  	"github.com/caos/orbos/internal/operator/nodeagent/dep/selinux"
    16  	"github.com/caos/orbos/mntr"
    17  )
    18  
    19  type Installer interface {
    20  	isKubelet()
    21  	nodeagent.Installer
    22  }
    23  
    24  type kubeletDep struct {
    25  	os      dep.OperatingSystem
    26  	monitor mntr.Monitor
    27  	common  *k8s.Common
    28  	systemd *dep.SystemD
    29  }
    30  
    31  func New(monitor mntr.Monitor, os dep.OperatingSystem, manager *dep.PackageManager, systemd *dep.SystemD) Installer {
    32  	return &kubeletDep{os, monitor, k8s.New(os, manager, "kubelet"), systemd}
    33  }
    34  
    35  func (kubeletDep) isKubelet() {}
    36  
    37  func (kubeletDep) Is(other nodeagent.Installer) bool {
    38  	_, ok := middleware.Unwrap(other).(Installer)
    39  	return ok
    40  }
    41  
    42  func (k kubeletDep) String() string { return "Kubelet" }
    43  
    44  func (*kubeletDep) Equals(other nodeagent.Installer) bool {
    45  	_, ok := other.(*kubeletDep)
    46  	return ok
    47  }
    48  
    49  func (k *kubeletDep) InstalledFilter() []string {
    50  	return []string{"kubelet"}
    51  }
    52  
    53  func (k *kubeletDep) Current() (pkg common.Package, err error) {
    54  
    55  	pkg, err = k.common.Current()
    56  	if err != nil || pkg.Version == "" {
    57  		return pkg, err
    58  	}
    59  
    60  	return pkg, selinux.Current(k.os, &pkg)
    61  }
    62  
    63  func (k *kubeletDep) Ensure(remove common.Package, install common.Package, leaveOSRepositories bool) error {
    64  
    65  	if err := selinux.EnsurePermissive(k.monitor, k.os, remove); err != nil {
    66  		return err
    67  	}
    68  
    69  	if k.os != dep.CentOS {
    70  		return k.ensurePackage(remove, install, leaveOSRepositories)
    71  	}
    72  
    73  	errBuf := new(bytes.Buffer)
    74  	defer errBuf.Reset()
    75  
    76  	cmd := exec.Command("modprobe", "br_netfilter")
    77  	cmd.Stderr = errBuf
    78  	if k.monitor.IsVerbose() {
    79  		fmt.Println(strings.Join(cmd.Args, " "))
    80  		cmd.Stdout = os.Stdout
    81  	}
    82  	if err := cmd.Run(); err != nil {
    83  		return fmt.Errorf("loading module br_netfilter while installing kubelet failed with stderr %s: %w", errBuf.String(), err)
    84  	}
    85  	errBuf.Reset()
    86  
    87  	return k.ensurePackage(remove, install, leaveOSRepositories)
    88  }
    89  
    90  func (k *kubeletDep) ensurePackage(remove common.Package, install common.Package, leaveOSRepositories bool) error {
    91  
    92  	if err := k.common.Ensure(remove, install, leaveOSRepositories); err != nil {
    93  		return err
    94  	}
    95  
    96  	if err := k.systemd.Enable("kubelet"); err != nil {
    97  		return err
    98  	}
    99  
   100  	return k.systemd.Start("kubelet")
   101  }