Skip to content

Commit a72cc39

Browse files
authored
Merge pull request #2014 from fluxcd/azure-blob-prefix
Fix azure blob prefix option not passed
2 parents 5376a7e + 45256dc commit a72cc39

File tree

2 files changed

+86
-1
lines changed

2 files changed

+86
-1
lines changed

internal/bucket/azure/blob.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,11 @@ func (c *BlobClient) FGetObject(ctx context.Context, bucketName, objectName, loc
343343
// If the underlying client or the visit callback returns an error,
344344
// it returns early.
345345
func (c *BlobClient) VisitObjects(ctx context.Context, bucketName string, prefix string, visit func(path, etag string) error) error {
346-
items := c.NewListBlobsFlatPager(bucketName, nil)
346+
opts := &azblob.ListBlobsFlatOptions{}
347+
if prefix != "" {
348+
opts.Prefix = &prefix
349+
}
350+
items := c.NewListBlobsFlatPager(bucketName, opts)
347351
for items.More() {
348352
resp, err := items.NextPage(ctx)
349353
if err != nil {

internal/bucket/azure/blob_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,87 @@ func Test_sasTokenFromSecret(t *testing.T) {
470470
}
471471
}
472472

473+
func TestBlobClient_VisitObjects_Prefix(t *testing.T) {
474+
bucketName := "test-bucket"
475+
476+
tests := []struct {
477+
name string
478+
prefix string
479+
}{
480+
{
481+
name: "with prefix",
482+
prefix: "subfolder/",
483+
},
484+
{
485+
name: "without prefix",
486+
prefix: "",
487+
},
488+
}
489+
490+
for _, tt := range tests {
491+
t.Run(tt.name, func(t *testing.T) {
492+
g := NewWithT(t)
493+
494+
// start mock bucket server
495+
bucketListener, bucketAddr, _ := testlistener.New(t)
496+
bucketEndpoint := fmt.Sprintf("http://%s", bucketAddr)
497+
bucketHandler := http.NewServeMux()
498+
bucketHandler.HandleFunc(fmt.Sprintf("GET /%s", bucketName), func(w http.ResponseWriter, r *http.Request) {
499+
q := r.URL.Query()
500+
g.Expect(q.Get("comp")).To(Equal("list"))
501+
g.Expect(q.Get("restype")).To(Equal("container"))
502+
503+
// Assert the prefix query parameter.
504+
if tt.prefix != "" {
505+
g.Expect(q.Get("prefix")).To(Equal(tt.prefix))
506+
} else {
507+
g.Expect(q.Has("prefix")).To(BeFalse(), "prefix query parameter should not be set when prefix is empty")
508+
}
509+
510+
resp := fmt.Sprintf(`<?xml version="1.0" encoding="utf-8"?>
511+
<EnumerationResults ContainerName="%s/%s">
512+
<Blobs>
513+
<Blob>
514+
<Name>%sfile.txt</Name>
515+
<Properties>
516+
<Etag>0x8D9B2A2A2A2A2A2</Etag>
517+
</Properties>
518+
</Blob>
519+
</Blobs>
520+
<NextMarker />
521+
</EnumerationResults>`, bucketEndpoint, bucketName, tt.prefix)
522+
_, err := w.Write([]byte(resp))
523+
g.Expect(err).ToNot(HaveOccurred())
524+
})
525+
bucketServer := &http.Server{
526+
Addr: bucketAddr,
527+
Handler: bucketHandler,
528+
}
529+
go bucketServer.Serve(bucketListener)
530+
defer bucketServer.Shutdown(context.Background())
531+
532+
bucket := &sourcev1.Bucket{
533+
Spec: sourcev1.BucketSpec{
534+
Endpoint: bucketEndpoint,
535+
},
536+
}
537+
client, err := NewClient(t.Context(),
538+
bucket,
539+
withoutCredentials(),
540+
withoutRetries())
541+
g.Expect(err).ToNot(HaveOccurred())
542+
543+
var visited []string
544+
err = client.VisitObjects(t.Context(), bucketName, tt.prefix, func(path, etag string) error {
545+
visited = append(visited, path)
546+
return nil
547+
})
548+
g.Expect(err).ToNot(HaveOccurred())
549+
g.Expect(visited).To(Equal([]string{tt.prefix + "file.txt"}))
550+
})
551+
}
552+
}
553+
473554
func Test_chainCredentialWithSecret(t *testing.T) {
474555
g := NewWithT(t)
475556

0 commit comments

Comments
 (0)