Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmd/nerdctl/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ func versionAction(cmd *cobra.Command, args []string) error {
// Address can be empty to skip inspecting the server.
func versionInfo(cmd *cobra.Command, ns, address string) (dockercompat.VersionInfo, error) {
v := dockercompat.VersionInfo{
Client: infoutil.ClientVersion(),
Client: infoutil.ClientVersion(cmd.Context()),
}
if address == "" {
return v, nil
Expand Down
49 changes: 47 additions & 2 deletions pkg/infoutil/infoutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
"strings"
"time"

"github.com/moby/moby/v2/pkg/sysinfo"

Check failure on line 28 in pkg/infoutil/infoutil.go

View workflow job for this annotation

GitHub Actions / go / freebsd

File is not properly formatted (gci)

Check failure on line 28 in pkg/infoutil/infoutil.go

View workflow job for this annotation

GitHub Actions / go / windows

File is not properly formatted (gci)

Check failure on line 28 in pkg/infoutil/infoutil.go

View workflow job for this annotation

GitHub Actions / go / linux

File is not properly formatted (gci)

Check failure on line 28 in pkg/infoutil/infoutil.go

View workflow job for this annotation

GitHub Actions / go / darwin

File is not properly formatted (gci)

containerd "github.com/containerd/containerd/v2/client"
"github.com/containerd/containerd/v2/core/introspection"
Expand All @@ -35,7 +35,9 @@
"github.com/containerd/nerdctl/v2/pkg/buildkitutil"
"github.com/containerd/nerdctl/v2/pkg/inspecttypes/dockercompat"
"github.com/containerd/nerdctl/v2/pkg/inspecttypes/native"
"github.com/containerd/nerdctl/v2/pkg/rootlessutil"
"github.com/containerd/nerdctl/v2/pkg/version"
"github.com/rootless-containers/rootlesskit/v3/pkg/api"
)

func NativeDaemonInfo(ctx context.Context, client *containerd.Client) (*native.DaemonInfo, error) {
Expand Down Expand Up @@ -113,8 +115,8 @@
return names, nil
}

func ClientVersion() dockercompat.ClientVersion {
return dockercompat.ClientVersion{
func ClientVersion(ctx context.Context) dockercompat.ClientVersion {
v := dockercompat.ClientVersion{
Version: version.GetVersion(),
GitCommit: version.GetRevision(),
GoVersion: runtime.Version(),
Expand All @@ -124,6 +126,10 @@
buildctlVersion(),
},
}
if rk := rootlesskitVersion(ctx); rk != nil {
v.Components = append(v.Components, *rk)
}
return v
}

func ServerVersion(ctx context.Context, client *containerd.Client) (*dockercompat.ServerVersion, error) {
Expand Down Expand Up @@ -190,6 +196,45 @@
return v, nil
}

// rootlesskitVersion returns the RootlessKit version info.
// It returns nil when not running rootless.
func rootlesskitVersion(ctx context.Context) *dockercompat.ComponentVersion {
if !rootlessutil.IsRootless() {
return nil
}
rlkClient, err := rootlessutil.NewRootlessKitClient()
if err != nil {
log.L.WithError(err).Warnf("unable to determine rootlesskit version")
return &dockercompat.ComponentVersion{Name: "rootlesskit"}
}
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
info, err := rlkClient.Info(ctx)
if err != nil {
log.L.WithError(err).Warnf("unable to determine rootlesskit version")
return &dockercompat.ComponentVersion{Name: "rootlesskit"}
}
return parseRootlesskitVersion(info)
}

func parseRootlesskitVersion(info *api.Info) *dockercompat.ComponentVersion {
v := &dockercompat.ComponentVersion{
Name: "rootlesskit",
Version: info.Version,
Details: map[string]string{
"ApiVersion": info.APIVersion,
"StateDir": info.StateDir,
},
}
if nd := info.NetworkDriver; nd != nil {
v.Details["NetworkDriver"] = nd.Driver
}
if pd := info.PortDriver; pd != nil {
v.Details["PortDriver"] = pd.Driver
}
return v
}

func runcVersion() dockercompat.ComponentVersion {
stdout, err := exec.Command("runc", "--version").Output()
if err != nil {
Expand Down
61 changes: 61 additions & 0 deletions pkg/infoutil/infoutil_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@

import (
"testing"

Check failure on line 21 in pkg/infoutil/infoutil_test.go

View workflow job for this annotation

GitHub Actions / go / freebsd

File is not properly formatted (gci)

Check failure on line 21 in pkg/infoutil/infoutil_test.go

View workflow job for this annotation

GitHub Actions / go / windows

File is not properly formatted (gci)

Check failure on line 21 in pkg/infoutil/infoutil_test.go

View workflow job for this annotation

GitHub Actions / go / linux

File is not properly formatted (gci)

Check failure on line 21 in pkg/infoutil/infoutil_test.go

View workflow job for this annotation

GitHub Actions / go / darwin

File is not properly formatted (gci)
"gotest.tools/v3/assert"

"github.com/containerd/nerdctl/v2/pkg/inspecttypes/dockercompat"
"github.com/rootless-containers/rootlesskit/v3/pkg/api"
)

func TestParseBuildctlVersion(t *testing.T) {
Expand Down Expand Up @@ -83,3 +84,63 @@
}
}
}

func TestParseRootlesskitVersion(t *testing.T) {
t.Parallel()

tests := []struct {
name string
info *api.Info
want *dockercompat.ComponentVersion
}{
{
name: "with network and port driver",
info: &api.Info{
Version: "2.0.0",
APIVersion: "1.1.1",
StateDir: "/run/user/1000/rootlesskit",
NetworkDriver: &api.NetworkDriverInfo{
Driver: "slirp4netns",
},
PortDriver: &api.PortDriverInfo{
Driver: "builtin",
},
},
want: &dockercompat.ComponentVersion{
Name: "rootlesskit",
Version: "2.0.0",
Details: map[string]string{
"ApiVersion": "1.1.1",
"StateDir": "/run/user/1000/rootlesskit",
"NetworkDriver": "slirp4netns",
"PortDriver": "builtin",
},
},
},
{
name: "without network and port driver",
info: &api.Info{
Version: "1.0.0",
APIVersion: "1.0.0",
StateDir: "/tmp/rk",
},
want: &dockercompat.ComponentVersion{
Name: "rootlesskit",
Version: "1.0.0",
Details: map[string]string{
"ApiVersion": "1.0.0",
"StateDir": "/tmp/rk",
},
},
},
}

for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
got := parseRootlesskitVersion(tt.info)
assert.DeepEqual(t, tt.want, got)
})
}
}
Loading