mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Make annotations OCI compliant
Changed annotation to follow the standard defined here: https://github.com/opencontainers/image-spec/blob/master/annotations.md PiperOrigin-RevId: 284254847
This commit is contained in:
committed by
gVisor bot
parent
b0066217ec
commit
ea7a100202
+14
-9
@@ -16,7 +16,6 @@ package boot
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strconv"
|
||||
@@ -52,7 +51,7 @@ const (
|
||||
rootDevice = "9pfs-/"
|
||||
|
||||
// MountPrefix is the annotation prefix for mount hints.
|
||||
MountPrefix = "gvisor.dev/spec/mount"
|
||||
MountPrefix = "dev.gvisor.spec.mount."
|
||||
|
||||
// Filesystems that runsc supports.
|
||||
bind = "bind"
|
||||
@@ -490,14 +489,15 @@ type podMountHints struct {
|
||||
func newPodMountHints(spec *specs.Spec) (*podMountHints, error) {
|
||||
mnts := make(map[string]*mountHint)
|
||||
for k, v := range spec.Annotations {
|
||||
// Look for 'gvisor.dev/spec/mount' annotations and parse them.
|
||||
// Look for 'dev.gvisor.spec.mount' annotations and parse them.
|
||||
if strings.HasPrefix(k, MountPrefix) {
|
||||
parts := strings.Split(k, "/")
|
||||
if len(parts) != 5 {
|
||||
// Remove the prefix and split the rest.
|
||||
parts := strings.Split(k[len(MountPrefix):], ".")
|
||||
if len(parts) != 2 {
|
||||
return nil, fmt.Errorf("invalid mount annotation: %s=%s", k, v)
|
||||
}
|
||||
name := parts[3]
|
||||
if len(name) == 0 || path.Clean(name) != name {
|
||||
name := parts[0]
|
||||
if len(name) == 0 {
|
||||
return nil, fmt.Errorf("invalid mount name: %s", name)
|
||||
}
|
||||
mnt := mnts[name]
|
||||
@@ -505,7 +505,7 @@ func newPodMountHints(spec *specs.Spec) (*podMountHints, error) {
|
||||
mnt = &mountHint{name: name}
|
||||
mnts[name] = mnt
|
||||
}
|
||||
if err := mnt.setField(parts[4], v); err != nil {
|
||||
if err := mnt.setField(parts[1], v); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
@@ -575,6 +575,11 @@ func newContainerMounter(spec *specs.Spec, goferFDs []int, k *kernel.Kernel, hin
|
||||
func (c *containerMounter) processHints(conf *Config) error {
|
||||
ctx := c.k.SupervisorContext()
|
||||
for _, hint := range c.hints.mounts {
|
||||
// TODO(b/142076984): Only support tmpfs for now. Bind mounts require a
|
||||
// common gofer to mount all shared volumes.
|
||||
if hint.mount.Type != tmpfs {
|
||||
continue
|
||||
}
|
||||
log.Infof("Mounting master of shared mount %q from %q type %q", hint.name, hint.mount.Source, hint.mount.Type)
|
||||
inode, err := c.mountSharedMaster(ctx, conf, hint)
|
||||
if err != nil {
|
||||
@@ -851,7 +856,7 @@ func (c *containerMounter) mountSubmount(ctx context.Context, conf *Config, mns
|
||||
return fmt.Errorf("mount %q error: %v", m.Destination, err)
|
||||
}
|
||||
|
||||
log.Infof("Mounted %q to %q type %s", m.Source, m.Destination, m.Type)
|
||||
log.Infof("Mounted %q to %q type: %s, internal-options: %q", m.Source, m.Destination, m.Type, opts)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
+48
-49
@@ -15,7 +15,6 @@
|
||||
package boot
|
||||
|
||||
import (
|
||||
"path"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
@@ -26,19 +25,19 @@ import (
|
||||
func TestPodMountHintsHappy(t *testing.T) {
|
||||
spec := &specs.Spec{
|
||||
Annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "source"): "foo",
|
||||
path.Join(MountPrefix, "mount1", "type"): "tmpfs",
|
||||
path.Join(MountPrefix, "mount1", "share"): "pod",
|
||||
MountPrefix + "mount1.source": "foo",
|
||||
MountPrefix + "mount1.type": "tmpfs",
|
||||
MountPrefix + "mount1.share": "pod",
|
||||
|
||||
path.Join(MountPrefix, "mount2", "source"): "bar",
|
||||
path.Join(MountPrefix, "mount2", "type"): "bind",
|
||||
path.Join(MountPrefix, "mount2", "share"): "container",
|
||||
path.Join(MountPrefix, "mount2", "options"): "rw,private",
|
||||
MountPrefix + "mount2.source": "bar",
|
||||
MountPrefix + "mount2.type": "bind",
|
||||
MountPrefix + "mount2.share": "container",
|
||||
MountPrefix + "mount2.options": "rw,private",
|
||||
},
|
||||
}
|
||||
podHints, err := newPodMountHints(spec)
|
||||
if err != nil {
|
||||
t.Errorf("newPodMountHints failed: %v", err)
|
||||
t.Fatalf("newPodMountHints failed: %v", err)
|
||||
}
|
||||
|
||||
// Check that fields were set correctly.
|
||||
@@ -86,95 +85,95 @@ func TestPodMountHintsErrors(t *testing.T) {
|
||||
{
|
||||
name: "too short",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1"): "foo",
|
||||
MountPrefix + "mount1": "foo",
|
||||
},
|
||||
error: "invalid mount annotation",
|
||||
},
|
||||
{
|
||||
name: "no name",
|
||||
annotations: map[string]string{
|
||||
MountPrefix + "//source": "foo",
|
||||
MountPrefix + ".source": "foo",
|
||||
},
|
||||
error: "invalid mount name",
|
||||
},
|
||||
{
|
||||
name: "missing source",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "type"): "tmpfs",
|
||||
path.Join(MountPrefix, "mount1", "share"): "pod",
|
||||
MountPrefix + "mount1.type": "tmpfs",
|
||||
MountPrefix + "mount1.share": "pod",
|
||||
},
|
||||
error: "source field",
|
||||
},
|
||||
{
|
||||
name: "missing type",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "source"): "foo",
|
||||
path.Join(MountPrefix, "mount1", "share"): "pod",
|
||||
MountPrefix + "mount1.source": "foo",
|
||||
MountPrefix + "mount1.share": "pod",
|
||||
},
|
||||
error: "type field",
|
||||
},
|
||||
{
|
||||
name: "missing share",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "source"): "foo",
|
||||
path.Join(MountPrefix, "mount1", "type"): "tmpfs",
|
||||
MountPrefix + "mount1.source": "foo",
|
||||
MountPrefix + "mount1.type": "tmpfs",
|
||||
},
|
||||
error: "share field",
|
||||
},
|
||||
{
|
||||
name: "invalid field name",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "invalid"): "foo",
|
||||
MountPrefix + "mount1.invalid": "foo",
|
||||
},
|
||||
error: "invalid mount annotation",
|
||||
},
|
||||
{
|
||||
name: "invalid source",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "source"): "",
|
||||
path.Join(MountPrefix, "mount1", "type"): "tmpfs",
|
||||
path.Join(MountPrefix, "mount1", "share"): "pod",
|
||||
MountPrefix + "mount1.source": "",
|
||||
MountPrefix + "mount1.type": "tmpfs",
|
||||
MountPrefix + "mount1.share": "pod",
|
||||
},
|
||||
error: "source cannot be empty",
|
||||
},
|
||||
{
|
||||
name: "invalid type",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "source"): "foo",
|
||||
path.Join(MountPrefix, "mount1", "type"): "invalid-type",
|
||||
path.Join(MountPrefix, "mount1", "share"): "pod",
|
||||
MountPrefix + "mount1.source": "foo",
|
||||
MountPrefix + "mount1.type": "invalid-type",
|
||||
MountPrefix + "mount1.share": "pod",
|
||||
},
|
||||
error: "invalid type",
|
||||
},
|
||||
{
|
||||
name: "invalid share",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "source"): "foo",
|
||||
path.Join(MountPrefix, "mount1", "type"): "tmpfs",
|
||||
path.Join(MountPrefix, "mount1", "share"): "invalid-share",
|
||||
MountPrefix + "mount1.source": "foo",
|
||||
MountPrefix + "mount1.type": "tmpfs",
|
||||
MountPrefix + "mount1.share": "invalid-share",
|
||||
},
|
||||
error: "invalid share",
|
||||
},
|
||||
{
|
||||
name: "invalid options",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "source"): "foo",
|
||||
path.Join(MountPrefix, "mount1", "type"): "tmpfs",
|
||||
path.Join(MountPrefix, "mount1", "share"): "pod",
|
||||
path.Join(MountPrefix, "mount1", "options"): "invalid-option",
|
||||
MountPrefix + "mount1.source": "foo",
|
||||
MountPrefix + "mount1.type": "tmpfs",
|
||||
MountPrefix + "mount1.share": "pod",
|
||||
MountPrefix + "mount1.options": "invalid-option",
|
||||
},
|
||||
error: "unknown mount option",
|
||||
},
|
||||
{
|
||||
name: "duplicate source",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "source"): "foo",
|
||||
path.Join(MountPrefix, "mount1", "type"): "tmpfs",
|
||||
path.Join(MountPrefix, "mount1", "share"): "pod",
|
||||
MountPrefix + "mount1.source": "foo",
|
||||
MountPrefix + "mount1.type": "tmpfs",
|
||||
MountPrefix + "mount1.share": "pod",
|
||||
|
||||
path.Join(MountPrefix, "mount2", "source"): "foo",
|
||||
path.Join(MountPrefix, "mount2", "type"): "bind",
|
||||
path.Join(MountPrefix, "mount2", "share"): "container",
|
||||
MountPrefix + "mount2.source": "foo",
|
||||
MountPrefix + "mount2.type": "bind",
|
||||
MountPrefix + "mount2.share": "container",
|
||||
},
|
||||
error: "have the same mount source",
|
||||
},
|
||||
@@ -202,36 +201,36 @@ func TestGetMountAccessType(t *testing.T) {
|
||||
{
|
||||
name: "container=exclusive",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "source"): source,
|
||||
path.Join(MountPrefix, "mount1", "type"): "bind",
|
||||
path.Join(MountPrefix, "mount1", "share"): "container",
|
||||
MountPrefix + "mount1.source": source,
|
||||
MountPrefix + "mount1.type": "bind",
|
||||
MountPrefix + "mount1.share": "container",
|
||||
},
|
||||
want: FileAccessExclusive,
|
||||
},
|
||||
{
|
||||
name: "pod=shared",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "source"): source,
|
||||
path.Join(MountPrefix, "mount1", "type"): "bind",
|
||||
path.Join(MountPrefix, "mount1", "share"): "pod",
|
||||
MountPrefix + "mount1.source": source,
|
||||
MountPrefix + "mount1.type": "bind",
|
||||
MountPrefix + "mount1.share": "pod",
|
||||
},
|
||||
want: FileAccessShared,
|
||||
},
|
||||
{
|
||||
name: "shared=shared",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "source"): source,
|
||||
path.Join(MountPrefix, "mount1", "type"): "bind",
|
||||
path.Join(MountPrefix, "mount1", "share"): "shared",
|
||||
MountPrefix + "mount1.source": source,
|
||||
MountPrefix + "mount1.type": "bind",
|
||||
MountPrefix + "mount1.share": "shared",
|
||||
},
|
||||
want: FileAccessShared,
|
||||
},
|
||||
{
|
||||
name: "default=shared",
|
||||
annotations: map[string]string{
|
||||
path.Join(MountPrefix, "mount1", "source"): source + "mismatch",
|
||||
path.Join(MountPrefix, "mount1", "type"): "bind",
|
||||
path.Join(MountPrefix, "mount1", "share"): "container",
|
||||
MountPrefix + "mount1.source": source + "mismatch",
|
||||
MountPrefix + "mount1.type": "bind",
|
||||
MountPrefix + "mount1.share": "container",
|
||||
},
|
||||
want: FileAccessShared,
|
||||
},
|
||||
|
||||
@@ -123,11 +123,11 @@ func execMany(execs []execDesc) error {
|
||||
|
||||
func createSharedMount(mount specs.Mount, name string, pod ...*specs.Spec) {
|
||||
for _, spec := range pod {
|
||||
spec.Annotations[path.Join(boot.MountPrefix, name, "source")] = mount.Source
|
||||
spec.Annotations[path.Join(boot.MountPrefix, name, "type")] = mount.Type
|
||||
spec.Annotations[path.Join(boot.MountPrefix, name, "share")] = "pod"
|
||||
spec.Annotations[boot.MountPrefix+name+".source"] = mount.Source
|
||||
spec.Annotations[boot.MountPrefix+name+".type"] = mount.Type
|
||||
spec.Annotations[boot.MountPrefix+name+".share"] = "pod"
|
||||
if len(mount.Options) > 0 {
|
||||
spec.Annotations[path.Join(boot.MountPrefix, name, "options")] = strings.Join(mount.Options, ",")
|
||||
spec.Annotations[boot.MountPrefix+name+".options"] = strings.Join(mount.Options, ",")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user