Remove conmon probe

This is taking time on every podman call, and provide limited
protection. Versioning should be handled in the packaging system
and this is an unlikely to happen.

Every exec done by container tools hurts us as we try to get container
startup team to absolute minimal amounts.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
Daniel J Walsh 2022-11-23 11:52:18 -05:00
parent d492ee0e30
commit f8045ec731
3 changed files with 5 additions and 157 deletions

View File

@ -959,11 +959,10 @@ func (c *NetworkConfig) Validate() error {
// to first (version) matching conmon binary. If non is found, we try // to first (version) matching conmon binary. If non is found, we try
// to do a path lookup of "conmon". // to do a path lookup of "conmon".
func (c *Config) FindConmon() (string, error) { func (c *Config) FindConmon() (string, error) {
return findConmonPath(c.Engine.ConmonPath, "conmon", _conmonMinMajorVersion, _conmonMinMinorVersion, _conmonMinPatchVersion) return findConmonPath(c.Engine.ConmonPath, "conmon")
} }
func findConmonPath(paths []string, binaryName string, major int, minor int, patch int) (string, error) { func findConmonPath(paths []string, binaryName string) (string, error) {
foundOutdatedConmon := false
for _, path := range paths { for _, path := range paths {
stat, err := os.Stat(path) stat, err := os.Stat(path)
if err != nil { if err != nil {
@ -972,29 +971,14 @@ func findConmonPath(paths []string, binaryName string, major int, minor int, pat
if stat.IsDir() { if stat.IsDir() {
continue continue
} }
if err := probeConmon(path); err != nil {
logrus.Warnf("Conmon at %s invalid: %v", path, err)
foundOutdatedConmon = true
continue
}
logrus.Debugf("Using conmon: %q", path) logrus.Debugf("Using conmon: %q", path)
return path, nil return path, nil
} }
// Search the $PATH as last fallback // Search the $PATH as last fallback
if path, err := exec.LookPath(binaryName); err == nil { if path, err := exec.LookPath(binaryName); err == nil {
if err := probeConmon(path); err != nil { logrus.Debugf("Using conmon from $PATH: %q", path)
logrus.Warnf("Conmon at %s is invalid: %v", path, err) return path, nil
foundOutdatedConmon = true
} else {
logrus.Debugf("Using conmon from $PATH: %q", path)
return path, nil
}
}
if foundOutdatedConmon {
return "", fmt.Errorf("please update to v%d.%d.%d or later: %w",
major, minor, patch, ErrConmonOutdated)
} }
return "", fmt.Errorf("could not find a working conmon binary (configured options: %v: %w)", return "", fmt.Errorf("could not find a working conmon binary (configured options: %v: %w)",
@ -1005,7 +989,7 @@ func findConmonPath(paths []string, binaryName string, major int, minor int, pat
// to first (version) matching conmonrs binary. If non is found, we try // to first (version) matching conmonrs binary. If non is found, we try
// to do a path lookup of "conmonrs". // to do a path lookup of "conmonrs".
func (c *Config) FindConmonRs() (string, error) { func (c *Config) FindConmonRs() (string, error) {
return findConmonPath(c.Engine.ConmonRsPath, "conmonrs", _conmonrsMinMajorVersion, _conmonrsMinMinorVersion, _conmonrsMinPatchVersion) return findConmonPath(c.Engine.ConmonRsPath, "conmonrs")
} }
// GetDefaultEnv returns the environment variables for the container. // GetDefaultEnv returns the environment variables for the container.

View File

@ -1,15 +1,11 @@
package config package config
import ( import (
"bytes"
"errors" "errors"
"fmt" "fmt"
"net" "net"
"os" "os"
"os/exec"
"path/filepath" "path/filepath"
"regexp"
"strconv"
"strings" "strings"
nettypes "github.com/containers/common/libnetwork/types" nettypes "github.com/containers/common/libnetwork/types"
@ -24,28 +20,6 @@ import (
) )
const ( const (
// _conmonMinMajorVersion is the major version required for conmon.
_conmonMinMajorVersion = 2
// _conmonMinMinorVersion is the minor version required for conmon.
_conmonMinMinorVersion = 0
// _conmonMinPatchVersion is the sub-minor version required for conmon.
_conmonMinPatchVersion = 1
// _conmonrsMinMajorVersion is the major version required for conmonrs.
_conmonrsMinMajorVersion = 0
// _conmonrsMinMinorVersion is the minor version required for conmonrs.
_conmonrsMinMinorVersion = 1
// _conmonrsMinPatchVersion is the sub-minor version required for conmonrs.
_conmonrsMinPatchVersion = 0
// _conmonVersionFormatErr is used when the expected versio-format of conmon
// has changed.
_conmonVersionFormatErr = "conmon version changed format: %w"
// _defaultGraphRoot points to the default path of the graph root. // _defaultGraphRoot points to the default path of the graph root.
_defaultGraphRoot = "/var/lib/containers/storage" _defaultGraphRoot = "/var/lib/containers/storage"
@ -470,70 +444,6 @@ func defaultTmpDir() (string, error) {
return filepath.Join(libpodRuntimeDir, "tmp"), nil return filepath.Join(libpodRuntimeDir, "tmp"), nil
} }
// probeConmon calls conmon --version and verifies it is a new enough version for
// the runtime expectations the container engine currently has.
func probeConmon(conmonBinary string) error {
cmd := exec.Command(conmonBinary, "--version")
var out bytes.Buffer
cmd.Stdout = &out
if err := cmd.Run(); err != nil {
return err
}
r := regexp.MustCompile(`^(version:|conmon version)? (?P<Major>\d+).(?P<Minor>\d+).(?P<Patch>\d+)`)
matches := r.FindStringSubmatch(out.String())
if len(matches) != 5 {
return fmt.Errorf(_conmonVersionFormatErr, errors.New("invalid version format"))
}
major, err := strconv.Atoi(matches[2])
var minMajor, minMinor, minPatch int
// conmon-rs returns "^version:"
if matches[1] == "version:" {
minMajor = _conmonrsMinMajorVersion
minMinor = _conmonrsMinMinorVersion
minPatch = _conmonrsMinPatchVersion
} else {
minMajor = _conmonMinMajorVersion
minMinor = _conmonMinMinorVersion
minPatch = _conmonMinPatchVersion
}
if err != nil {
return fmt.Errorf(_conmonVersionFormatErr, err)
}
if major < minMajor {
return ErrConmonOutdated
}
if major > minMajor {
return nil
}
minor, err := strconv.Atoi(matches[3])
if err != nil {
return fmt.Errorf(_conmonVersionFormatErr, err)
}
if minor < minMinor {
return ErrConmonOutdated
}
if minor > minMinor {
return nil
}
patch, err := strconv.Atoi(matches[4])
if err != nil {
return fmt.Errorf(_conmonVersionFormatErr, err)
}
if patch < minPatch {
return ErrConmonOutdated
}
if patch > minPatch {
return nil
}
return nil
}
// NetNS returns the default network namespace. // NetNS returns the default network namespace.
func (c *Config) NetNS() string { func (c *Config) NetNS() string {
return c.Containers.NetNS return c.Containers.NetNS

View File

@ -1,7 +1,6 @@
package config package config
import ( import (
"errors"
"fmt" "fmt"
"os" "os"
"testing" "testing"
@ -24,51 +23,6 @@ func prepareProbeBinary(t *testing.T, expectedOutput string) (path string) {
return f.Name() return f.Name()
} }
func TestProbeConmon(t *testing.T) {
t.Parallel()
for _, tc := range []struct {
msg string
output string
assert func(error, string)
}{
{
msg: "success conmon 2",
output: "conmon version 2.1.0",
assert: func(err error, msg string) {
assert.Nil(t, err, msg)
},
},
{
msg: "success conmon 3",
output: "conmon version 3.0.0-dev",
assert: func(x error, msg string) {
assert.Nil(t, x, msg)
},
},
{
msg: "failure outdated version",
output: "conmon version 1.0.0",
assert: func(err error, msg string) {
assert.Equal(t, err, ErrConmonOutdated, msg)
},
},
{
msg: "failure invalid format",
output: "invalid",
assert: func(err error, msg string) {
expectedErr := fmt.Errorf(_conmonVersionFormatErr, errors.New("invalid version format"))
assert.Equal(t, err, expectedErr, msg)
},
},
} {
filePath := prepareProbeBinary(t, tc.output)
defer os.RemoveAll(filePath)
err := probeConmon(filePath)
tc.assert(err, tc.msg)
}
}
func TestMachineVolumes(t *testing.T) { func TestMachineVolumes(t *testing.T) {
t.Parallel() t.Parallel()