Skip to content

Commit

Permalink
API: StatsObject non nil on empty metadata (#7026)
Browse files Browse the repository at this point in the history
* API: stats return non nil metadata

align response with upload

* align more api response to include empty metadata if needed
  • Loading branch information
nopcoder authored Nov 22, 2023
1 parent 5b2b79e commit bbea569
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 17 deletions.
18 changes: 17 additions & 1 deletion pkg/api/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -2766,6 +2766,7 @@ func (c *Controller) UploadObject(w http.ResponseWriter, r *http.Request, reposi
PhysicalAddress: qk.Format(),
SizeBytes: swag.Int64(blob.Size),
ContentType: &contentType,
Metadata: &apigen.ObjectUserMetadata{AdditionalProperties: meta},
}
writeResponse(w, r, http.StatusCreated, response)
}
Expand Down Expand Up @@ -2898,6 +2899,13 @@ func (c *Controller) CopyObject(w http.ResponseWriter, r *http.Request, body api
return
}

var metadata map[string]string
if entry.Metadata != nil {
metadata = entry.Metadata
} else {
metadata = map[string]string{}
}

response := apigen.ObjectStats{
Checksum: entry.Checksum,
Mtime: entry.CreationDate.Unix(),
Expand All @@ -2906,6 +2914,7 @@ func (c *Controller) CopyObject(w http.ResponseWriter, r *http.Request, body api
PhysicalAddress: qk.Format(),
SizeBytes: swag.Int64(entry.Size),
ContentType: swag.String(entry.ContentType),
Metadata: &apigen.ObjectUserMetadata{AdditionalProperties: metadata},
}
writeResponse(w, r, http.StatusCreated, response)
}
Expand Down Expand Up @@ -4023,9 +4032,16 @@ func (c *Controller) StatObject(w http.ResponseWriter, r *http.Request, reposito
SizeBytes: swag.Int64(entry.Size),
ContentType: swag.String(entry.ContentType),
}

// add metadata if requested
var metadata map[string]string
if (params.UserMetadata == nil || *params.UserMetadata) && entry.Metadata != nil {
objStat.Metadata = &apigen.ObjectUserMetadata{AdditionalProperties: entry.Metadata}
metadata = entry.Metadata
} else {
metadata = map[string]string{}
}
objStat.Metadata = &apigen.ObjectUserMetadata{AdditionalProperties: metadata}

code := http.StatusOK
if entry.Expired {
code = http.StatusGone
Expand Down
53 changes: 37 additions & 16 deletions pkg/api/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -357,8 +357,8 @@ func TestController_LogCommitsParallelHandler(t *testing.T) {
}

var g multierror.Group
for path, logRef := range commitsToLook {
objects := []string{path}
for objPath, logRef := range commitsToLook {
objects := []string{objPath}
params := &apigen.LogCommitsParams{Objects: &objects}
log := logRef
g.Go(func() error {
Expand Down Expand Up @@ -1452,10 +1452,10 @@ func TestController_CreateBranchHandler(t *testing.T) {
if len(reference) == 0 {
t.Fatalf("branch %s creation got no reference", newBranchName)
}
const path = "some/path"
const objPath = "some/path"
const content = "hello world!"

uploadResp, err := uploadObjectHelper(t, ctx, clt, path, strings.NewReader(content), repo, newBranchName)
uploadResp, err := uploadObjectHelper(t, ctx, clt, objPath, strings.NewReader(content), repo, newBranchName)
verifyResponseOK(t, uploadResp, err)

if _, err := deps.catalog.Commit(ctx, repo, "main2", "commit 1", "some_user", nil, nil, nil); err != nil {
Expand All @@ -1467,7 +1467,7 @@ func TestController_CreateBranchHandler(t *testing.T) {
if len(results) != 1 {
t.Fatalf("unexpected length of results: %d", len(results))
}
if results[0].Path != path {
if results[0].Path != objPath {
t.Fatalf("wrong result: %s", results[0].Path)
}
})
Expand Down Expand Up @@ -1581,8 +1581,8 @@ func TestController_DiffRefsHandler(t *testing.T) {
t.Fatalf("branch %s creation got no reference", newBranchName)
}
const prefix = "some/"
const path = "path"
const fullPath = prefix + path
const objPath = "path"
const fullPath = prefix + objPath
const content = "hello world!"

uploadResp, err := uploadObjectHelper(t, ctx, clt, fullPath, strings.NewReader(content), repoName, newBranchName)
Expand Down Expand Up @@ -1841,6 +1841,27 @@ func TestController_ObjectsStatObjectHandler(t *testing.T) {
t.Fatal(err)
}

t.Run("object_stat_no_metadata", func(t *testing.T) {
const objPath = "foo/bar-no-metadata"
entry := catalog.DBEntry{
Path: objPath,
PhysicalAddress: "this_is_bars_address",
CreationDate: time.Now(),
Size: 666,
Checksum: "this_is_a_checksum",
}
testutil.Must(t, deps.catalog.CreateEntry(ctx, repo, "main", entry))

resp, err := clt.StatObjectWithResponse(ctx, repo, "main", &apigen.StatObjectParams{Path: objPath})
verifyResponseOK(t, resp, err)
if resp.JSON200 == nil {
t.Fatalf("expected to get back object stats, got status %s", resp.Status())
}
if resp.JSON200.Metadata == nil {
t.Fatal("expected to not get back empty user-defined metadata, got nil")
}
})

t.Run("get object stats", func(t *testing.T) {
entry := catalog.DBEntry{
Path: "foo/bar",
Expand Down Expand Up @@ -1879,8 +1900,8 @@ func TestController_ObjectsStatObjectHandler(t *testing.T) {
resp, err = clt.StatObjectWithResponse(ctx, repo, "main", &apigen.StatObjectParams{Path: "foo/bar", UserMetadata: &getUserMetadata})
verifyResponseOK(t, resp, err)
objectStatsNoMetadata := resp.JSON200
if objectStatsNoMetadata.Metadata != nil {
t.Fatalf("expected to not get back user-defined metadata, got %+v", objectStatsNoMetadata.Metadata.AdditionalProperties)
if objectStatsNoMetadata.Metadata == nil || len(objectStatsNoMetadata.Metadata.AdditionalProperties) != 0 {
t.Fatalf("expected to not get back empty user-defined metadata, got %+v", objectStatsNoMetadata.Metadata.AdditionalProperties)
}
})

Expand Down Expand Up @@ -3793,8 +3814,8 @@ func TestController_PrepareGarbageCollectionUncommitted(t *testing.T) {
testutil.Must(t, err)
const items = 3
for i := 0; i < items; i++ {
path := fmt.Sprintf("uncommitted/obj%d", i)
uploadResp, err := uploadObjectHelper(t, ctx, clt, path, strings.NewReader(path), repo, "main")
objPath := fmt.Sprintf("uncommitted/obj%d", i)
uploadResp, err := uploadObjectHelper(t, ctx, clt, objPath, strings.NewReader(objPath), repo, "main")
verifyResponseOK(t, uploadResp, err)
}
verifyPrepareGarbageCollection(t, repo, 1, true)
Expand All @@ -3806,8 +3827,8 @@ func TestController_PrepareGarbageCollectionUncommitted(t *testing.T) {
testutil.Must(t, err)
const items = 3
for i := 0; i < items; i++ {
path := fmt.Sprintf("committed/obj%d", i)
uploadResp, err := uploadObjectHelper(t, ctx, clt, path, strings.NewReader(path), repo, "main")
objPath := fmt.Sprintf("committed/obj%d", i)
uploadResp, err := uploadObjectHelper(t, ctx, clt, objPath, strings.NewReader(objPath), repo, "main")
verifyResponseOK(t, uploadResp, err)
}
if _, err := deps.catalog.Commit(ctx, repo, "main", "committed objects", "some_user", nil, nil, nil); err != nil {
Expand All @@ -3822,14 +3843,14 @@ func TestController_PrepareGarbageCollectionUncommitted(t *testing.T) {
testutil.Must(t, err)
const items = 3
for i := 0; i < items; i++ {
path := fmt.Sprintf("uncommitted/obj%d", i)
uploadResp, err := uploadObjectHelper(t, ctx, clt, path, strings.NewReader(path), repo, "main")
objPath := fmt.Sprintf("uncommitted/obj%d", i)
uploadResp, err := uploadObjectHelper(t, ctx, clt, objPath, strings.NewReader(objPath), repo, "main")
verifyResponseOK(t, uploadResp, err)

copyResp, err := clt.CopyObjectWithResponse(ctx, repo, "main",
&apigen.CopyObjectParams{DestPath: fmt.Sprintf("copy/obj%d", i)},
apigen.CopyObjectJSONRequestBody{
SrcPath: path,
SrcPath: objPath,
})
verifyResponseOK(t, copyResp, err)
}
Expand Down

0 comments on commit bbea569

Please sign in to comment.