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

     1  package cri
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"os/exec"
     7  	"strings"
     8  
     9  	"github.com/caos/orbos/internal/operator/nodeagent/dep"
    10  )
    11  
    12  func (c *criDep) ensureCentOS(runtime string, version string, leaveOSRepositories bool) error {
    13  
    14  	if err := c.manager.Remove(
    15  		&dep.Software{Package: "docker"},
    16  		&dep.Software{Package: "docker-client"},
    17  		&dep.Software{Package: "docker-client-latest"},
    18  		&dep.Software{Package: "docker-common"},
    19  		&dep.Software{Package: "docker-latest"},
    20  		&dep.Software{Package: "docker-latest-logrotate"},
    21  		&dep.Software{Package: "docker-logrotate"},
    22  		&dep.Software{Package: "docker-engine"},
    23  	); err != nil {
    24  		return fmt.Errorf("removing older docker versions failed: %w", err)
    25  	}
    26  
    27  	if err := c.manager.Install(&dep.Software{Package: "device-mapper-persistent-data"}, &dep.Software{Package: "lvm2"}); err != nil {
    28  		c.monitor.Error(fmt.Errorf("installing docker dependency failed: %w", err))
    29  	}
    30  
    31  	return c.run(
    32  		runtime,
    33  		version,
    34  		"https://download.docker.com/linux/centos/docker-ce.repo",
    35  		"",
    36  		"",
    37  		leaveOSRepositories,
    38  	)
    39  }
    40  
    41  func (c *criDep) ensureUbuntu(runtime string, version string, leaveOSRepositories bool) error {
    42  
    43  	errBuf := new(bytes.Buffer)
    44  	defer errBuf.Reset()
    45  	buf := new(bytes.Buffer)
    46  	defer buf.Reset()
    47  
    48  	var versionLine string
    49  	cmd := exec.Command("apt-cache", "madison", runtime)
    50  	cmd.Stderr = errBuf
    51  	cmd.Stdout = buf
    52  	if err := cmd.Run(); err != nil {
    53  		return fmt.Errorf("running apt-cache madison %s failed with stderr %s: %w", runtime, errBuf.String(), err)
    54  	}
    55  	errBuf.Reset()
    56  
    57  	if c.monitor.IsVerbose() {
    58  		fmt.Println(strings.Join(cmd.Args, " "))
    59  	}
    60  
    61  	var err error
    62  	for err == nil {
    63  		versionLine, err = buf.ReadString('\n')
    64  		if c.monitor.IsVerbose() {
    65  			fmt.Println(versionLine)
    66  		}
    67  		if strings.Contains(versionLine, version) {
    68  			break
    69  		}
    70  	}
    71  	buf.Reset()
    72  
    73  	if err != nil && versionLine == "" {
    74  		return fmt.Errorf("finding line containing desired container runtime version \"%s\" failed: %w", version, err)
    75  	}
    76  
    77  	return c.run(
    78  		runtime,
    79  		strings.TrimSpace(strings.Split(versionLine, "|")[1]),
    80  		fmt.Sprintf("deb [arch=amd64] https://download.docker.com/linux/ubuntu %s stable", c.os.Version),
    81  		"https://download.docker.com/linux/ubuntu/gpg",
    82  		"0EBFCD88",
    83  		leaveOSRepositories,
    84  	)
    85  }
    86  
    87  func (c *criDep) run(runtime, version, repoURL, keyURL, keyFingerprint string, leaveOSRepositories bool) error {
    88  
    89  	swmonitor := c.monitor.WithField("software", "docker")
    90  
    91  	if !leaveOSRepositories {
    92  		if err := c.manager.Add(&dep.Repository{
    93  			Repository:     repoURL,
    94  			KeyURL:         keyURL,
    95  			KeyFingerprint: keyFingerprint,
    96  		}); err != nil {
    97  			return err
    98  		}
    99  
   100  		swmonitor.WithField("url", repoURL).Info("repo added")
   101  	}
   102  
   103  	// Obviously, docker doesn't care about the exact containerd version, so neighter should ORBITER
   104  	// https://docs.docker.com/engine/install/centos/
   105  	// https://docs.docker.com/engine/install/ubuntu/
   106  	if err := c.manager.Install(&dep.Software{
   107  		Package: "containerd.io",
   108  		Version: installContainerdVersion,
   109  	}); err != nil {
   110  		return err
   111  	}
   112  
   113  	if err := c.manager.Install(&dep.Software{
   114  		Package: runtime,
   115  		Version: version,
   116  	}); err != nil {
   117  		return err
   118  	}
   119  
   120  	if err := c.systemd.Enable("docker"); err != nil {
   121  		return err
   122  	}
   123  	return c.systemd.Start("docker")
   124  }