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 }