Skip to content

Commit 14dac0f

Browse files
committed
oci: metadata encode/decode (fix; unit)
Signed-off-by: Alex Aizman <alex.aizman@gmail.com>
1 parent dfa6328 commit 14dac0f

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

ais/test/oci/unit_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Package oci unit test.
2+
/*
3+
* Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved.
4+
*/
5+
package oci_test
6+
7+
import (
8+
"net/http"
9+
"testing"
10+
11+
"github.com/NVIDIA/aistore/cmn"
12+
)
13+
14+
func TestOCIUserMetadataEncodeDecode(t *testing.T) {
15+
in := map[string]string{"foo": "bar", "X-Num": "42"}
16+
hdr := cmn.BackendHelpers.OCI.EncodeMetadata(in)
17+
if len(hdr) != 2 {
18+
t.Fatalf("expected 2 headers, got %d", len(hdr))
19+
}
20+
if _, ok := hdr["Opc-Meta-Foo"]; !ok {
21+
t.Fatalf("missing Opc-Meta-Foo, got keys: %v", hdr)
22+
}
23+
if _, ok := hdr["Opc-Meta-X-Num"]; !ok {
24+
t.Fatalf("missing Opc-Meta-X-Num, got keys: %v", hdr)
25+
}
26+
h := http.Header{}
27+
for k, v := range hdr {
28+
h.Set(k, v)
29+
}
30+
out := cmn.BackendHelpers.OCI.DecodeMetadata(h)
31+
if out["Foo"] != "bar" || out["X-Num"] != "42" {
32+
t.Fatalf("round-trip mismatch: %+v", out)
33+
}
34+
}

cmn/backend.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ const AwsMultipartDelim = "-"
3535
// - https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html#UserMetadata
3636
const AwsHeaderMetaPrefix = "X-Amz-Meta-"
3737

38+
// OCI Object Storage user metadata
39+
// from: https://docs.oracle.com/en-us/iaas/Content/Object/Tasks/managingobjects.htm
40+
// User metadata uses the "opc-meta-" prefix (canonicalized to "Opc-Meta-").
41+
const OCIHeaderMetaPrefix = "Opc-Meta-"
42+
3843
func isS3MultipartEtag(etag string) bool {
3944
return strings.Contains(etag, AwsMultipartDelim)
4045
}
@@ -210,14 +215,24 @@ var BackendHelpers = struct {
210215
return "", false
211216
}
212217
},
213-
218+
EncodeMetadata: func(metadata map[string]string) (header map[string]string) {
219+
if len(metadata) == 0 {
220+
return
221+
}
222+
header = make(map[string]string, len(metadata))
223+
for k, v := range metadata {
224+
key := http.CanonicalHeaderKey(OCIHeaderMetaPrefix + k)
225+
header[key] = v
226+
}
227+
return
228+
},
214229
DecodeMetadata: func(header http.Header) (metadata map[string]string) {
215230
for headerKey := range header {
216-
if strings.HasPrefix(headerKey, AwsHeaderMetaPrefix) {
231+
if strings.HasPrefix(headerKey, OCIHeaderMetaPrefix) {
217232
if metadata == nil {
218233
metadata = make(map[string]string)
219234
}
220-
key := strings.TrimPrefix(headerKey, AwsHeaderMetaPrefix)
235+
key := strings.TrimPrefix(headerKey, OCIHeaderMetaPrefix)
221236
value := header.Get(headerKey)
222237
metadata[key] = value
223238
}

0 commit comments

Comments
 (0)