Move labels to pkg/labels

Signed-off-by: Derek McGowan <derek@mcg.dev>
This commit is contained in:
Derek McGowan
2024-01-17 09:55:30 -08:00
parent bb71c28353
commit b76236bb45
26 changed files with 23 additions and 23 deletions

29
pkg/labels/labels.go Normal file
View File

@@ -0,0 +1,29 @@
/*
Copyright The containerd Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package labels
// LabelUncompressed is added to compressed layer contents.
// The value is digest of the uncompressed content.
const LabelUncompressed = "containerd.io/uncompressed"
// LabelSharedNamespace is added to a namespace to allow that namespaces
// contents to be shared.
const LabelSharedNamespace = "containerd.io/namespace.shareable"
// LabelDistributionSource is added to content to indicate its origin.
// e.g., "containerd.io/distribution.source.docker.io=library/redis"
const LabelDistributionSource = "containerd.io/distribution.source"

41
pkg/labels/validate.go Normal file
View File

@@ -0,0 +1,41 @@
/*
Copyright The containerd Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package labels
import (
"fmt"
"github.com/containerd/containerd/v2/pkg/errdefs"
)
const (
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
func Validate(k, v string) error {
total := len(k) + len(v)
if total > maxSize {
if len(k) > keyMaxLen {
k = k[:keyMaxLen]
}
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
}

View File

@@ -0,0 +1,80 @@
/*
Copyright The containerd Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package labels
import (
"strings"
"testing"
"github.com/containerd/containerd/v2/pkg/errdefs"
"github.com/stretchr/testify/assert"
)
func TestValidLabels(t *testing.T) {
shortStr := "s"
longStr := strings.Repeat("s", maxSize-1)
for key, value := range map[string]string{
"some": "value",
shortStr: longStr,
} {
if err := Validate(key, value); err != nil {
t.Fatalf("unexpected error: %v != nil", err)
}
}
}
func TestInvalidLabels(t *testing.T) {
addOneStr := "s"
maxSizeStr := strings.Repeat("s", maxSize)
for key, value := range map[string]string{
maxSizeStr: addOneStr,
} {
if err := Validate(key, value); err == nil {
t.Fatal("expected invalid error")
} else if !errdefs.IsInvalidArgument(err) {
t.Fatal("error should be an invalid label error")
}
}
}
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)
}