Skip to content

Commit ec4ad53

Browse files
authored
Merge pull request #3506 from darfux/copy_md_when_set_ttrpcheader
namespace: Copy ttrpc metadata before setting header
2 parents c0cf9a5 + a3a3063 commit ec4ad53

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

namespaces/ttrpc.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,20 @@ const (
2727
TTRPCHeader = "containerd-namespace-ttrpc"
2828
)
2929

30+
func copyMetadata(src ttrpc.MD) ttrpc.MD {
31+
md := ttrpc.MD{}
32+
for k, v := range src {
33+
md[k] = append(md[k], v...)
34+
}
35+
return md
36+
}
37+
3038
func withTTRPCNamespaceHeader(ctx context.Context, namespace string) context.Context {
3139
md, ok := ttrpc.GetMetadata(ctx)
3240
if !ok {
3341
md = ttrpc.MD{}
42+
} else {
43+
md = copyMetadata(md)
3444
}
3545
md.Set(TTRPCHeader, namespace)
3646
return ttrpc.WithMetadata(ctx, md)

namespaces/ttrpc_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
Copyright The containerd Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package namespaces
18+
19+
import (
20+
"context"
21+
"reflect"
22+
"testing"
23+
24+
"github.com/containerd/ttrpc"
25+
)
26+
27+
func TestCopyTTRPCMetadata(t *testing.T) {
28+
src := ttrpc.MD{}
29+
src.Set("key", "a", "b", "c", "d")
30+
md := copyMetadata(src)
31+
32+
if !reflect.DeepEqual(src, md) {
33+
t.Fatalf("metadata is copied incorrectly")
34+
}
35+
36+
slice, _ := src.Get("key")
37+
slice[0] = "z"
38+
if reflect.DeepEqual(src, md) {
39+
t.Fatalf("metadata is copied incorrectly")
40+
}
41+
}
42+
43+
func TestTTRPCNamespaceHeader(t *testing.T) {
44+
ctx := context.Background()
45+
namespace := "test-namepace"
46+
ctx = withTTRPCNamespaceHeader(ctx, namespace)
47+
48+
header, ok := fromTTRPCHeader(ctx)
49+
if !ok || header != namespace {
50+
t.Fatalf("ttrp namespace header is set incorrectly")
51+
}
52+
}

0 commit comments

Comments
 (0)