29
									
								
								pkg/labels/labels.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								pkg/labels/labels.go
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										41
									
								
								pkg/labels/validate.go
									
									
									
									
									
										Normal 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 | ||||
| } | ||||
							
								
								
									
										80
									
								
								pkg/labels/validate_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								pkg/labels/validate_test.go
									
									
									
									
									
										Normal 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) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Derek McGowan
					Derek McGowan