Skip to content

Commit

Permalink
Merge pull request containerd#3881 from liaojh1998/idmap
Browse files Browse the repository at this point in the history
Split uid and gid user ns remapping in oci
  • Loading branch information
AkihiroSuda committed Dec 11, 2019
2 parents f0c6684 + 51a6813 commit f01665a
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 17 deletions.
22 changes: 17 additions & 5 deletions container_linux_test.go
Expand Up @@ -1362,12 +1362,24 @@ func testUserNamespaces(t *testing.T, readonlyRootFS bool) {

opts := []NewContainerOpts{WithNewSpec(oci.WithImageConfig(image),
withExitStatus(7),
oci.WithUserNamespace(0, 1000, 10000),
oci.WithUserNamespace([]specs.LinuxIDMapping{
{
ContainerID: 0,
HostID: 1000,
Size: 10000,
},
}, []specs.LinuxIDMapping{
{
ContainerID: 0,
HostID: 2000,
Size: 10000,
},
}),
)}
if readonlyRootFS {
opts = append([]NewContainerOpts{WithRemappedSnapshotView(id, image, 1000, 1000)}, opts...)
opts = append([]NewContainerOpts{WithRemappedSnapshotView(id, image, 1000, 2000)}, opts...)
} else {
opts = append([]NewContainerOpts{WithRemappedSnapshot(id, image, 1000, 1000)}, opts...)
opts = append([]NewContainerOpts{WithRemappedSnapshot(id, image, 1000, 2000)}, opts...)
}

container, err := client.NewContainer(ctx, id, opts...)
Expand All @@ -1380,12 +1392,12 @@ func testUserNamespaces(t *testing.T, readonlyRootFS bool) {
if CheckRuntime(client.runtime, "io.containerd.runc") {
copts = &options.Options{
IoUid: 1000,
IoGid: 1000,
IoGid: 2000,
}
} else {
copts = &runctypes.CreateOptions{
IoUid: 1000,
IoGid: 1000,
IoGid: 2000,
}
}

Expand Down
11 changes: 3 additions & 8 deletions oci/spec_opts.go
Expand Up @@ -439,7 +439,7 @@ func WithHostLocaltime(_ context.Context, _ Client, _ *containers.Container, s *

// WithUserNamespace sets the uid and gid mappings for the task
// this can be called multiple times to add more mappings to the generated spec
func WithUserNamespace(container, host, size uint32) SpecOpts {
func WithUserNamespace(uidMap, gidMap []specs.LinuxIDMapping) SpecOpts {
return func(_ context.Context, _ Client, _ *containers.Container, s *Spec) error {
var hasUserns bool
setLinux(s)
Expand All @@ -454,13 +454,8 @@ func WithUserNamespace(container, host, size uint32) SpecOpts {
Type: specs.UserNamespace,
})
}
mapping := specs.LinuxIDMapping{
ContainerID: container,
HostID: host,
Size: size,
}
s.Linux.UIDMappings = append(s.Linux.UIDMappings, mapping)
s.Linux.GIDMappings = append(s.Linux.GIDMappings, mapping)
s.Linux.UIDMappings = append(s.Linux.UIDMappings, uidMap...)
s.Linux.GIDMappings = append(s.Linux.GIDMappings, gidMap...)
return nil
}
}
Expand Down
29 changes: 25 additions & 4 deletions oci/spec_opts_test.go
Expand Up @@ -467,21 +467,42 @@ func TestWithTTYSize(t *testing.T) {
func TestWithUserNamespace(t *testing.T) {
t.Parallel()
s := Spec{}

opts := []SpecOpts{
WithUserNamespace(1, 2, 20000),
WithUserNamespace([]specs.LinuxIDMapping{
{
ContainerID: 1,
HostID: 2,
Size: 10000,
},
}, []specs.LinuxIDMapping{
{
ContainerID: 2,
HostID: 3,
Size: 20000,
},
}),
}

for _, opt := range opts {
if err := opt(nil, nil, nil, &s); err != nil {
t.Fatal(err)
}
}
testMapping := specs.LinuxIDMapping{

expectedUIDMapping := specs.LinuxIDMapping{
ContainerID: 1,
HostID: 2,
Size: 10000,
}
expectedGIDMapping := specs.LinuxIDMapping{
ContainerID: 2,
HostID: 3,
Size: 20000,
}
if !(len(s.Linux.UIDMappings) == 1 && s.Linux.UIDMappings[0] == testMapping) || !(len(s.Linux.GIDMappings) == 1 && s.Linux.GIDMappings[0] == testMapping) {
t.Fatal("WithUserNamespace Cannot set the uid/gid mappings for the task")

if !(len(s.Linux.UIDMappings) == 1 && s.Linux.UIDMappings[0] == expectedUIDMapping) || !(len(s.Linux.GIDMappings) == 1 && s.Linux.GIDMappings[0] == expectedGIDMapping) {
t.Fatal("WithUserNamespace Cannot set the uid/gid mappings for the task")
}

}
Expand Down

0 comments on commit f01665a

Please sign in to comment.