image/label: print more characters of label keys

Like stargz and nydus remote snapshotter, some snapshots
lables are introduced and passed to snapshotter from containerd
automatically. The label keys' length are all longer than 10.

The limitation of 10 characters makes it harder to debug what label
is not appropriate. So we'd better to print more of the wrong label.

Signed-off-by: Changwei Ge <gechangwei@bytedance.com>
This commit is contained in:
Changwei Ge 2022-11-02 19:17:59 +08:00
parent 405fba75dd
commit 176e8d35ce
2 changed files with 34 additions and 4 deletions

View File

@ -24,15 +24,18 @@ import (
const ( const (
maxSize = 4096 maxSize = 4096
// maximum length of key portion of error message if len of key + len of value > maxSize
keyMaxLen = 64
) )
// Validate a label's key and value are under 4096 bytes // Validate a label's key and value are under 4096 bytes
func Validate(k, v string) error { func Validate(k, v string) error {
if (len(k) + len(v)) > maxSize { total := len(k) + len(v)
if len(k) > 10 { if total > maxSize {
k = k[:10] if len(k) > keyMaxLen {
k = k[:keyMaxLen]
} }
return fmt.Errorf("label key and value greater than maximum size (%d bytes), key: %s: %w", maxSize, k, errdefs.ErrInvalidArgument) return fmt.Errorf("label key and value length (%d bytes) greater than maximum size (%d bytes), key: %s: %w", total, maxSize, k, errdefs.ErrInvalidArgument)
} }
return nil return nil
} }

View File

@ -21,6 +21,7 @@ import (
"testing" "testing"
"github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/errdefs"
"github.com/stretchr/testify/assert"
) )
func TestValidLabels(t *testing.T) { func TestValidLabels(t *testing.T) {
@ -51,3 +52,29 @@ func TestInvalidLabels(t *testing.T) {
} }
} }
} }
func TestLongKey(t *testing.T) {
key := strings.Repeat("s", keyMaxLen+1)
value := strings.Repeat("v", maxSize-len(key))
err := Validate(key, value)
assert.Equal(t, err, nil)
key = strings.Repeat("s", keyMaxLen+12)
value = strings.Repeat("v", maxSize-len(key)+1)
err = Validate(key, value)
assert.ErrorIs(t, err, errdefs.ErrInvalidArgument)
key = strings.Repeat("s", keyMaxLen-1)
value = strings.Repeat("v", maxSize-len(key))
err = Validate(key, value)
assert.Equal(t, err, nil)
key = strings.Repeat("s", keyMaxLen-1)
value = strings.Repeat("v", maxSize-len(key)-1)
err = Validate(key, value)
assert.Equal(t, err, nil)
}