From 3eb2523300ca16c1eefd067b823c9cac9850c72a Mon Sep 17 00:00:00 2001 From: Manu Gupta Date: Thu, 7 Jul 2022 23:18:15 -0700 Subject: [PATCH] Display buildkit and runc version in nerdctl Fixes#1082 Signed-off-by: Manu Gupta --- pkg/infoutil/infoutil.go | 68 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/pkg/infoutil/infoutil.go b/pkg/infoutil/infoutil.go index 34c1d8251dd..8a413721cc8 100644 --- a/pkg/infoutil/infoutil.go +++ b/pkg/infoutil/infoutil.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "os" + "os/exec" "runtime" "strings" "time" @@ -28,10 +29,12 @@ import ( "github.com/containerd/containerd" ptypes "github.com/containerd/containerd/protobuf/types" "github.com/containerd/containerd/services/introspection" + "github.com/containerd/nerdctl/pkg/buildkitutil" "github.com/containerd/nerdctl/pkg/inspecttypes/dockercompat" "github.com/containerd/nerdctl/pkg/inspecttypes/native" "github.com/containerd/nerdctl/pkg/logging" "github.com/containerd/nerdctl/pkg/version" + "github.com/sirupsen/logrus" ) func NativeDaemonInfo(ctx context.Context, client *containerd.Client) (*native.DaemonInfo, error) { @@ -133,8 +136,9 @@ func ServerVersion(ctx context.Context, client *containerd.Client) (*dockercompa Version: daemonVersion.Version, Details: map[string]string{"GitCommit": daemonVersion.Revision}, }, + buildctlVersion(), + runcVersion(), }, - // TODO: add runc version } return v, nil } @@ -151,6 +155,68 @@ func ServerSemVer(ctx context.Context, client *containerd.Client) (*semver.Versi return sv, nil } +func buildctlVersion() dockercompat.ComponentVersion { + buildctlBinary, err := buildkitutil.BuildctlBinary() + if err != nil { + logrus.Warnf("unable to determine buildkit version: %s", err.Error()) + return dockercompat.ComponentVersion{Name: "buildkit"} + } + + stdout, err := exec.Command(buildctlBinary, "--version").Output() + if err != nil { + logrus.Warnf("unable to determine buildkit version: %s", err.Error()) + return dockercompat.ComponentVersion{Name: "buildkit"} + } + + versionStr := strings.Fields(strings.TrimSpace(string(stdout))) + if len(versionStr) != 4 { + logrus.Errorf("expected buildctl --version return 4 space separated values, got: %s", versionStr) + return dockercompat.ComponentVersion{Name: "buildkit"} + } + + return dockercompat.ComponentVersion{ + Name: "buildctl", + Version: versionStr[2], + Details: map[string]string{"GitCommit": versionStr[3]}, + } +} + +func runcVersion() dockercompat.ComponentVersion { + stdout, err := exec.Command("runc", "--version").Output() + if err != nil { + logrus.Warnf("unable to determine runc version: %s", err.Error()) + return dockercompat.ComponentVersion{Name: "runc"} + } + + var versionList = strings.Split(strings.TrimSpace(string(stdout)), "\n") + firstLine := strings.Fields(versionList[0]) + if len(firstLine) != 3 { + logrus.Errorf("expected runc --version to return version line have 3 space separated values, got: %s", firstLine) + return dockercompat.ComponentVersion{Name: "runc"} + } + version := firstLine[2] + + details := map[string]string{} + for _, detailsLine := range versionList[1:] { + logrus.Info(detailsLine) + detail := strings.Fields(detailsLine) + logrus.Info("detail: ", detail) + + if len(detail) != 2 { + logrus.Errorf("expected runc --version to return metadata line have 2 space separated values, got: %s, %d", detail, len(detail)) + return dockercompat.ComponentVersion{Name: "runc"} + } + + details[detail[0]] = detail[1] + } + + return dockercompat.ComponentVersion{ + Name: "runc", + Version: version, + Details: details, + } +} + //BlockIOWeight return whether Block IO weight is supported or not func BlockIOWeight(cgroupManager string) bool { var info *dockercompat.Info