Skip to content

Commit

Permalink
registry/storage/driver/azure: fix storage path to use leading slash
Browse files Browse the repository at this point in the history
this keeps backwards compability with pre-v3 registries.
  • Loading branch information
flavianmissi committed Feb 8, 2024
1 parent c7be7b4 commit b41b254
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 14 deletions.
26 changes: 12 additions & 14 deletions registry/storage/driver/azure/azure.go
Original file line number Diff line number Diff line change
Expand Up @@ -404,20 +404,9 @@ func (d *driver) listBlobs(ctx context.Context, virtPath string) ([]string, erro
virtPath += "/"
}

// we will replace the root directory prefix before returning blob names
blobPrefix := d.blobName("")

// This is to cover for the cases when the rootDirectory of the driver is either "" or "/".
// In those cases, there is no root prefix to replace and we must actually add a "/" to all
// results in order to keep them as valid paths as recognized by storagedriver.PathRegexp
prefix := ""
if blobPrefix == "" {
prefix = "/"
}

out := []string{}

listPrefix := d.blobName(virtPath)

pager := d.client.NewListBlobsFlatPager(&container.ListBlobsFlatOptions{
Prefix: &listPrefix,
})
Expand All @@ -431,7 +420,14 @@ func (d *driver) listBlobs(ctx context.Context, virtPath string) ([]string, erro
return nil, fmt.Errorf("required blob property Name is missing while listing blobs under: %s", listPrefix)
}
name := *blob.Name
out = append(out, strings.Replace(name, blobPrefix, prefix, 1))

// This is to cover for the cases when the rootDirectory of the driver is either "" or "/".
// In those cases, there is no root prefix to replace and we must actually add a "/" to all
// results in order to keep them as valid paths as recognized by storagedriver.PathRegexp
if !strings.HasPrefix(name, "/") { // add leading '/'
name = "/" + name
}
out = append(out, name)
}
}

Expand All @@ -446,7 +442,9 @@ func (d *driver) blobName(path string) string {
return path
}

return strings.TrimLeft(strings.TrimRight(d.rootDirectory, "/")+path, "/")
trimmedRoot := strings.TrimRight(d.rootDirectory, "/")
trimmedPath := strings.TrimLeft(path, "/")
return trimmedRoot + "/" + trimmedPath
}

func is404(err error) bool {
Expand Down
58 changes: 58 additions & 0 deletions registry/storage/driver/azure/azure_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,64 @@ func randStringRunes(n int) string {
return string(b)
}

func writeBlob(ctx context.Context, driver storagedriver.StorageDriver, contents, path string, append_ bool) error {
writer, err := driver.Writer(ctx, path, append_)
if err != nil {
return fmt.Errorf("unexpected error from driver.Writer: %v", err)
}
_, err = writer.Write([]byte(contents))
if err != nil {
return fmt.Errorf("writer.Write: unexpected error: %v", err)
}

err = writer.Commit()
if err != nil {
return fmt.Errorf("writer.Commit: unexpected error: %v", err)
}
err = writer.Close()
if err != nil {
return fmt.Errorf("writer.Close: unexpected error: %v", err)
}
return nil
}

func TestListBlobs(t *testing.T) {
driver, err := azureDriverConstructor()
if err != nil {
t.Fatalf("unexpected error creating azure driver: %v", err)
}

contents := randStringRunes(4 * 1024 * 1024)
path := "/file"
ctx := context.Background()

defer driver.Delete(ctx, path)
if err := writeBlob(ctx, driver, contents, path, false); err != nil {
t.Fatal(err)
}

blobNames, err := driver.List(ctx, "/")
if err != nil {
t.Fatalf("driver.List: unexpected error: %v", err)
}

if len(blobNames) == 0 {
t.Fatalf("blob %q was not listed! driver.List returned 0 blobs!", path)
}

found := false
for _, blobName := range blobNames {
if blobName == path {
found = true
break
}
fmt.Println("TestListBlobs blobName", blobName, "did not match path", path)
}
if !found {
t.Fatalf("blob %q was not listed!", path)
}
}

func TestCommitAfterMove(t *testing.T) {
driver, err := azureDriverConstructor()
if err != nil {
Expand Down

0 comments on commit b41b254

Please sign in to comment.