From 2d3e2b279569c7313cc57ac719dd6765e0003994 Mon Sep 17 00:00:00 2001 From: vickstrom Date: Tue, 23 Sep 2025 10:12:16 +0200 Subject: [PATCH] implement support for direct url for AzureBlobStorageUrlReader search function Signed-off-by: vickstrom --- .changeset/calm-trains-tie.md | 5 +++ .../backend-defaults/report-urlReader.api.md | 5 ++- .../lib/AzureBlobStorageUrlReader.ts | 40 +++++++++++++++++-- 3 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 .changeset/calm-trains-tie.md diff --git a/.changeset/calm-trains-tie.md b/.changeset/calm-trains-tie.md new file mode 100644 index 0000000000..8c399ba123 --- /dev/null +++ b/.changeset/calm-trains-tie.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': minor +--- + +implement support for direct url for AzureBlobStorageUrlReader search function diff --git a/packages/backend-defaults/report-urlReader.api.md b/packages/backend-defaults/report-urlReader.api.md index 03a112abc7..039d51808d 100644 --- a/packages/backend-defaults/report-urlReader.api.md +++ b/packages/backend-defaults/report-urlReader.api.md @@ -87,7 +87,10 @@ export class AzureBlobStorageUrlReader implements UrlReaderService { options?: UrlReaderServiceReadUrlOptions, ): Promise; // (undocumented) - search(): Promise; + search( + url: string, + options?: UrlReaderServiceSearchOptions, + ): Promise; // (undocumented) toString(): string; } diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts index e04e2c5b47..1953beabe9 100644 --- a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts +++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts @@ -21,7 +21,11 @@ import { StorageSharedKeyCredential, } from '@azure/storage-blob'; import { ReaderFactory, ReadTreeResponseFactory } from './types'; -import { ForwardedError, NotModifiedError } from '@backstage/errors'; +import { + assertError, + ForwardedError, + NotModifiedError, +} from '@backstage/errors'; import { Readable } from 'stream'; import { relative } from 'path/posix'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; @@ -37,6 +41,7 @@ import { UrlReaderServiceReadTreeResponse, UrlReaderServiceReadUrlOptions, UrlReaderServiceReadUrlResponse, + UrlReaderServiceSearchOptions, UrlReaderServiceSearchResponse, } from '@backstage/backend-plugin-api'; @@ -190,13 +195,13 @@ export class AzureBlobStorageUrlReader implements UrlReaderService { const { path, container } = parseUrl(url); const containerClient = await this.createContainerClient(container); - const blobs = containerClient.listBlobsFlat({ prefix: path }); const responses = []; for await (const blob of blobs) { const blobClient = containerClient.getBlobClient(blob.name); + const downloadBlockBlobResponse = await blobClient.download( undefined, undefined, @@ -221,8 +226,35 @@ export class AzureBlobStorageUrlReader implements UrlReaderService { } } - async search(): Promise { - throw new Error('AzureBlobStorageUrlReader does not implement search'); + async search( + url: string, + options?: UrlReaderServiceSearchOptions, + ): Promise { + const { path } = parseUrl(url); + + if (path.match(/[*?]/)) { + throw new Error( + 'Glob search pattern not implemented for AzureBlobStorageUrlReader', + ); + } + + try { + const data = await this.readUrl(url, options); + + return { + files: [ + { + url: url, + content: data.buffer, + lastModifiedAt: data.lastModifiedAt, + }, + ], + etag: data.etag ?? '', + }; + } catch (error) { + assertError(error); + throw error; + } } toString() {