From c2dfd1cf0135ddef22a1dc647a0b7e75cc6e133d Mon Sep 17 00:00:00 2001 From: Taras Date: Mon, 15 Feb 2021 12:18:25 -0500 Subject: [PATCH 01/12] Added fail test for error reporting when accountKey is missing --- .../stages/publish/azureBlobStorage.test.ts | 95 +++++++++++++++---- 1 file changed, 76 insertions(+), 19 deletions(-) diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts index 80f3cb0cf7..18724a84f9 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts @@ -19,6 +19,7 @@ import { getVoidLogger } from '@backstage/backend-common'; import { AzureBlobStoragePublish } from './azureBlobStorage'; import { PublisherBase } from './types'; import type { Entity } from '@backstage/catalog-model'; +import type { Logger } from 'winston'; const createMockEntity = (annotations = {}) => { return { @@ -43,33 +44,40 @@ const getEntityRootDir = (entity: Entity) => { return entityRootDir; }; -const logger = getVoidLogger(); -jest.spyOn(logger, 'info').mockReturnValue(logger); -jest.spyOn(logger, 'error').mockReturnValue(logger); +function createLogger() { + const logger = getVoidLogger(); + jest.spyOn(logger, 'info').mockReturnValue(logger); + jest.spyOn(logger, 'error').mockReturnValue(logger); + return logger; +} let publisher: PublisherBase; -beforeEach(async () => { - const mockConfig = new ConfigReader({ - techdocs: { - requestUrl: 'http://localhost:7000', - publisher: { - type: 'azureBlobStorage', - azureBlobStorage: { - credentials: { - accountName: 'accountName', - accountKey: 'accountKey', +describe('publishing with valid credentials', () => { + let logger: Logger; + + beforeEach(async () => { + const mockConfig = new ConfigReader({ + techdocs: { + requestUrl: 'http://localhost:7000', + publisher: { + type: 'azureBlobStorage', + azureBlobStorage: { + credentials: { + accountName: 'accountName', + accountKey: 'accountKey', + }, + containerName: 'containerName', }, - containerName: 'containerName', }, }, - }, + }); + + logger = createLogger(); + + publisher = await AzureBlobStoragePublish.fromConfig(mockConfig, logger); }); - publisher = await AzureBlobStoragePublish.fromConfig(mockConfig, logger); -}); - -describe('AzureBlobStoragePublish', () => { describe('publish', () => { it('should publish a directory', async () => { const entity = createMockEntity(); @@ -145,3 +153,52 @@ describe('AzureBlobStoragePublish', () => { }); }); }); + +describe('attempting to publish with invalid credentials', () => { + let logger: Logger; + + describe('accountKey is not specified', () => { + beforeEach(async () => { + const mockConfig = new ConfigReader({ + techdocs: { + requestUrl: 'http://localhost:7000', + publisher: { + type: 'azureBlobStorage', + azureBlobStorage: { + credentials: { + accountName: 'accountName', + }, + containerName: 'containerName', + }, + }, + }, + }); + + logger = createLogger(); + + publisher = await AzureBlobStoragePublish.fromConfig(mockConfig, logger); + }); + + describe('without Azure environment variables', () => { + it('should log an error', async () => { + const entity = createMockEntity(); + const entityRootDir = getEntityRootDir(entity); + + mockFs({ + [entityRootDir]: { + 'index.html': '', + }, + }); + + await publisher.publish({ + entity, + directory: entityRootDir, + }); + + expect(logger.error).toHaveBeenCalled(); + + mockFs.restore(); + }); + }); + }); +}); From ef5a18a9f9be74cdcdccf9ae3e93522dec7a0bfb Mon Sep 17 00:00:00 2001 From: Taras Date: Mon, 15 Feb 2021 18:30:55 -0500 Subject: [PATCH 02/12] Remove unnecessary array of promises --- .../src/stages/publish/azureBlobStorage.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts index a02639e63f..e36254b164 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts @@ -122,8 +122,6 @@ export class AzureBlobStoragePublish implements PublisherBase { // So collecting path of only the files is good enough. const allFilesToUpload = await getFileTreeRecursively(directory); - const uploadPromises: Array> = []; - // Bound the number of concurrent batches. We want a bit of concurrency for // performance reasons, but not so much that we starve the connection pool // or start thrashing. @@ -139,13 +137,11 @@ export class AzureBlobStoragePublish implements PublisherBase { `${entityRootDir}/${relativeFilePath}`, ); // Azure Blob Storage Container file relative path - return limiter(async () => { - await uploadPromises.push( - this.storageClient - .getContainerClient(this.containerName) - .getBlockBlobClient(destination) - .uploadFile(filePath), - ); + return limiter(() => { + return this.storageClient + .getContainerClient(this.containerName) + .getBlockBlobClient(destination) + .uploadFile(filePath); }); }); From 4d483cbc10a827df2b1f66dbf6d5ad81c179907c Mon Sep 17 00:00:00 2001 From: Taras Date: Mon, 15 Feb 2021 21:52:54 -0500 Subject: [PATCH 03/12] Add tests for error reporting --- .../__mocks__/@azure/storage-blob.ts | 72 ++++++++++---- .../stages/publish/azureBlobStorage.test.ts | 96 +++++++++++-------- .../src/stages/publish/azureBlobStorage.ts | 49 +++++----- 3 files changed, 141 insertions(+), 76 deletions(-) diff --git a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts index 60a705f6a7..29f3178efb 100644 --- a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts +++ b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts @@ -14,6 +14,10 @@ * limitations under the License. */ import fs from 'fs'; +import type { + BlobUploadCommonResponse, + ContainerGetPropertiesResponse, +} from '@azure/storage-blob'; export class BlockBlobClient { private readonly blobName; @@ -22,23 +26,29 @@ export class BlockBlobClient { this.blobName = blobName; } - uploadFile(source: string) { - return new Promise((resolve, reject) => { - if (!fs.existsSync(source)) { - reject(''); - } else { - resolve(''); - } + uploadFile(source: string): Promise { + return Promise.resolve({ + _response: { + request: {} as any, + status: 200, + headers: {} as any, + }, }); } exists() { - return new Promise((resolve, reject) => { - if (fs.existsSync(this.blobName)) { - resolve(true); - } else { - reject({ message: 'The object doest not exist !' }); - } + return Promise.resolve(fs.existsSync(this.blobName)); + } +} + +class BlockBlobClientFailUpload extends BlockBlobClient { + uploadFile(source: string): Promise { + return Promise.resolve({ + _response: { + request: {} as any, + status: 500, + headers: {} as any, + }, }); } } @@ -50,9 +60,14 @@ export class ContainerClient { this.containerName = containerName; } - getProperties() { - return new Promise(resolve => { - resolve(''); + getProperties(): Promise { + return Promise.resolve({ + _response: { + request: {} as any, + status: 200, + headers: {} as any, + parsedHeaders: {}, + }, }); } @@ -61,6 +76,25 @@ export class ContainerClient { } } +class ContainerClientFailGetProperties extends ContainerClient { + getProperties(): Promise { + return Promise.resolve({ + _response: { + request: {} as any, + status: 404, + headers: {} as any, + parsedHeaders: {}, + }, + }); + } +} + +class ContainerClientFailUpload extends ContainerClient { + getBlockBlobClient(blobName: string) { + return new BlockBlobClientFailUpload(blobName); + } +} + export class BlobServiceClient { private readonly url; private readonly credential; @@ -71,6 +105,12 @@ export class BlobServiceClient { } getContainerClient(containerName: string) { + if (containerName === 'bad_container') { + return new ContainerClientFailGetProperties(containerName); + } + if (this.credential.accountName === 'failupload') { + return new ContainerClientFailUpload(containerName); + } return new ContainerClient(containerName); } } diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts index 18724a84f9..b37d6c9379 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts @@ -154,51 +154,71 @@ describe('publishing with valid credentials', () => { }); }); -describe('attempting to publish with invalid credentials', () => { - let logger: Logger; - - describe('accountKey is not specified', () => { - beforeEach(async () => { - const mockConfig = new ConfigReader({ - techdocs: { - requestUrl: 'http://localhost:7000', - publisher: { - type: 'azureBlobStorage', - azureBlobStorage: { - credentials: { - accountName: 'accountName', - }, - containerName: 'containerName', +describe('error reporting', () => { + it('reports an error when unable to read container properties', async () => { + const mockConfig = new ConfigReader({ + techdocs: { + requestUrl: 'http://localhost:7000', + publisher: { + type: 'azureBlobStorage', + azureBlobStorage: { + credentials: { + accountName: 'accountName', }, + containerName: 'bad_container', }, }, - }); - - logger = createLogger(); - - publisher = await AzureBlobStoragePublish.fromConfig(mockConfig, logger); + }, }); - describe('without Azure environment variables', () => { - it('should log an error', async () => { - const entity = createMockEntity(); - const entityRootDir = getEntityRootDir(entity); + const logger = createLogger(); - mockFs({ - [entityRootDir]: { - 'index.html': '', + publisher = await AzureBlobStoragePublish.fromConfig(mockConfig, logger); + + expect(logger.error).toHaveBeenCalledWith( + `Could not read Azure Blob Storage container properties`, + ); + }); + + it('reports an error when bad account credentials', async () => { + const mockConfig = new ConfigReader({ + techdocs: { + requestUrl: 'http://localhost:7000', + publisher: { + type: 'azureBlobStorage', + azureBlobStorage: { + credentials: { + accountName: 'failupload', + accountKey: 'accountKey', + }, + containerName: 'containerName', }, - }); - - await publisher.publish({ - entity, - directory: entityRootDir, - }); - - expect(logger.error).toHaveBeenCalled(); - - mockFs.restore(); - }); + }, + }, }); + + const logger = createLogger(); + + publisher = await AzureBlobStoragePublish.fromConfig(mockConfig, logger); + + const entity = createMockEntity(); + const entityRootDir = getEntityRootDir(entity); + + mockFs({ + [entityRootDir]: { + 'index.html': '', + }, + }); + + await publisher.publish({ + entity, + directory: entityRootDir, + }); + + expect(logger.error).toHaveBeenCalledWith( + `Unable to upload 1 file(s) to Azure Blob Storage.`, + ); + + mockFs.restore(); }); }); diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts index e36254b164..b0b2bfd855 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts @@ -82,10 +82,16 @@ export class AzureBlobStoragePublish implements PublisherBase { await storageClient .getContainerClient(containerName) .getProperties() - .then(() => { - logger.info( - `Successfully connected to the Azure Blob Storage container ${containerName}.`, - ); + .then(result => { + if (result?._response?.status >= 400) { + logger.error( + 'Could not read Azure Blob Storage container properties', + ); + } else { + logger.info( + `Successfully connected to the Azure Blob Storage container ${containerName}.`, + ); + } }) .catch(reason => { logger.error( @@ -145,16 +151,23 @@ export class AzureBlobStoragePublish implements PublisherBase { }); }); - await Promise.all(promises).then(() => { + let responses: BlobUploadCommonResponse[] = []; + + responses = await Promise.all(promises); + + const failed = responses.filter(r => r?._response?.status >= 400); + if (failed.length === 0) { this.logger.info( `Successfully uploaded all the generated files for Entity ${entity.metadata.name}. Total number of files: ${allFilesToUpload.length}`, ); - }); - return; + } else { + const errorMessage = `Unable to upload ${failed.length} file(s) to Azure Blob Storage.`; + this.logger.error(errorMessage); + } } catch (e) { const errorMessage = `Unable to upload file(s) to Azure Blob Storage. Error ${e.message}`; this.logger.error(errorMessage); - throw new Error(errorMessage); + return; } } @@ -237,19 +250,11 @@ export class AzureBlobStoragePublish implements PublisherBase { * A helper function which checks if index.html of an Entity's docs site is available. This * can be used to verify if there are any pre-generated docs available to serve. */ - async hasDocsBeenGenerated(entity: Entity): Promise { - return new Promise(resolve => { - const entityRootDir = `${entity.metadata.namespace}/${entity.kind}/${entity.metadata.name}`; - this.storageClient - .getContainerClient(this.containerName) - .getBlockBlobClient(`${entityRootDir}/index.html`) - .exists() - .then((response: boolean) => { - resolve(response); - }) - .catch(() => { - resolve(false); - }); - }); + hasDocsBeenGenerated(entity: Entity): Promise { + const entityRootDir = `${entity.metadata.namespace}/${entity.kind}/${entity.metadata.name}`; + return this.storageClient + .getContainerClient(this.containerName) + .getBlockBlobClient(`${entityRootDir}/index.html`) + .exists(); } } From e518093dceac901d2cf9c6e68af54c7124da75c6 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Mon, 15 Feb 2021 21:57:11 -0500 Subject: [PATCH 04/12] Create quiet-dots-mix.md --- .changeset/quiet-dots-mix.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/quiet-dots-mix.md diff --git a/.changeset/quiet-dots-mix.md b/.changeset/quiet-dots-mix.md new file mode 100644 index 0000000000..b1186b320f --- /dev/null +++ b/.changeset/quiet-dots-mix.md @@ -0,0 +1,5 @@ +--- +"@backstage/techdocs-common": patch +--- + +Changed AzureBlobStorage to show errors when upload fails From 79f7bb4665d950104783a82203a6052b507cf671 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Tue, 16 Feb 2021 08:23:08 +0100 Subject: [PATCH 05/12] Update .changeset/quiet-dots-mix.md --- .changeset/quiet-dots-mix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/quiet-dots-mix.md b/.changeset/quiet-dots-mix.md index b1186b320f..a83278671e 100644 --- a/.changeset/quiet-dots-mix.md +++ b/.changeset/quiet-dots-mix.md @@ -1,5 +1,5 @@ --- -"@backstage/techdocs-common": patch +'@backstage/techdocs-common': patch --- Changed AzureBlobStorage to show errors when upload fails From 4de00ead3887a1dd8307745b1ab46d3e40a1f58a Mon Sep 17 00:00:00 2001 From: Taras Date: Tue, 16 Feb 2021 09:00:17 -0500 Subject: [PATCH 06/12] Report errors when creating AzureBlobPublisher and requirements are not satisfied --- .../__mocks__/@azure/storage-blob.ts | 16 ++++++-- .../stages/publish/azureBlobStorage.test.ts | 13 +++++- .../src/stages/publish/azureBlobStorage.ts | 40 ++++++++----------- 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts index 29f3178efb..6633a71b2c 100644 --- a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts +++ b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts @@ -29,7 +29,9 @@ export class BlockBlobClient { uploadFile(source: string): Promise { return Promise.resolve({ _response: { - request: {} as any, + request: { + url: `https://example.blob.core.windows.net`, + } as any, status: 200, headers: {} as any, }, @@ -45,7 +47,9 @@ class BlockBlobClientFailUpload extends BlockBlobClient { uploadFile(source: string): Promise { return Promise.resolve({ _response: { - request: {} as any, + request: { + url: `https://example.blob.core.windows.net`, + } as any, status: 500, headers: {} as any, }, @@ -63,7 +67,9 @@ export class ContainerClient { getProperties(): Promise { return Promise.resolve({ _response: { - request: {} as any, + request: { + url: `https://example.blob.core.windows.net`, + } as any, status: 200, headers: {} as any, parsedHeaders: {}, @@ -80,7 +86,9 @@ class ContainerClientFailGetProperties extends ContainerClient { getProperties(): Promise { return Promise.resolve({ _response: { - request: {} as any, + request: { + url: `https://example.blob.core.windows.net`, + } as any, status: 404, headers: {} as any, parsedHeaders: {}, diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts index b37d6c9379..baeb644301 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts @@ -173,10 +173,19 @@ describe('error reporting', () => { const logger = createLogger(); - publisher = await AzureBlobStoragePublish.fromConfig(mockConfig, logger); + let error; + try { + publisher = await AzureBlobStoragePublish.fromConfig(mockConfig, logger); + } catch (e) { + error = e; + } + + expect(error).toBeInstanceOf(Error); expect(logger.error).toHaveBeenCalledWith( - `Could not read Azure Blob Storage container properties`, + expect.stringContaining( + `Could not retrieve metadata about the Azure Blob Storage container bad_container.`, + ), ); }); diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts index b0b2bfd855..f73417156a 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts @@ -79,31 +79,25 @@ export class AzureBlobStoragePublish implements PublisherBase { credential, ); - await storageClient - .getContainerClient(containerName) - .getProperties() - .then(result => { - if (result?._response?.status >= 400) { - logger.error( - 'Could not read Azure Blob Storage container properties', - ); - } else { - logger.info( - `Successfully connected to the Azure Blob Storage container ${containerName}.`, - ); - } - }) - .catch(reason => { - logger.error( - `Could not retrieve metadata about the Azure Blob Storage container ${containerName}. ` + - 'Make sure that the Azure project and container exist and the access key is setup correctly ' + - 'techdocs.publisher.azureBlobStorage.credentials defined in app config has correct permissions. ' + - 'Refer to https://backstage.io/docs/features/techdocs/using-cloud-storage', - ); + try { + const metadata = await storageClient + .getContainerClient(containerName) + .getProperties(); + + if (metadata._response.status >= 400) { throw new Error( - `from Azure Blob Storage client library: ${reason.message}`, + `Failed to retrieve metadata from ${metadata._response.request.url} with status code ${metadata._response.status}.`, ); - }); + } + } catch (e) { + logger.error( + `Could not retrieve metadata about the Azure Blob Storage container ${containerName}. ` + + 'Make sure that the Azure project and container exist and the access key is setup correctly ' + + 'techdocs.publisher.azureBlobStorage.credentials defined in app config has correct permissions. ' + + 'Refer to https://backstage.io/docs/features/techdocs/using-cloud-storage', + ); + throw new Error(`from Azure Blob Storage client library: ${e.message}`); + } return new AzureBlobStoragePublish(storageClient, containerName, logger); } From 02c5ce979c49aac15b6e4dde159905598d75e79a Mon Sep 17 00:00:00 2001 From: Taras Date: Tue, 16 Feb 2021 12:52:32 -0500 Subject: [PATCH 07/12] Throwing errors --- .../stages/publish/azureBlobStorage.test.ts | 23 +++++++--- .../src/stages/publish/azureBlobStorage.ts | 43 +++++++++++++------ 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts index baeb644301..62c81df5c4 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts @@ -124,7 +124,7 @@ describe('publishing with valid credentials', () => { }) .catch(error => expect(error.message).toContain( - 'Unable to upload file(s) to Azure Blob Storage. Error Failed to read template directory: ENOENT, no such file or directory', + 'Unable to upload file(s) to Azure Blob Storage. Failed to read template directory: ENOENT, no such file or directory', ), ); mockFs.restore(); @@ -219,13 +219,24 @@ describe('error reporting', () => { }, }); - await publisher.publish({ - entity, - directory: entityRootDir, - }); + let error; + try { + await publisher.publish({ + entity, + directory: entityRootDir, + }); + } catch (e) { + error = e; + } + + expect(error.message).toContain( + `Unable to upload file(s) to Azure Blob Storage.`, + ); expect(logger.error).toHaveBeenCalledWith( - `Unable to upload 1 file(s) to Azure Blob Storage.`, + expect.stringContaining( + `Unable to upload file(s) to Azure Blob Storage. Upload failed for test-namespace/TestKind/test-component-name/index.html with status code 500`, + ), ); mockFs.restore(); diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts index f73417156a..07e1053b99 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts @@ -80,13 +80,13 @@ export class AzureBlobStoragePublish implements PublisherBase { ); try { - const metadata = await storageClient + const response = await storageClient .getContainerClient(containerName) .getProperties(); - if (metadata._response.status >= 400) { + if (response._response.status >= 400) { throw new Error( - `Failed to retrieve metadata from ${metadata._response.request.url} with status code ${metadata._response.status}.`, + `Failed to retrieve metadata from ${response._response.request.url} with status code ${response._response.status}.`, ); } } catch (e) { @@ -137,31 +137,46 @@ export class AzureBlobStoragePublish implements PublisherBase { `${entityRootDir}/${relativeFilePath}`, ); // Azure Blob Storage Container file relative path - return limiter(() => { - return this.storageClient + return limiter(async () => { + const response = await this.storageClient .getContainerClient(this.containerName) .getBlockBlobClient(destination) .uploadFile(filePath); + + if (response._response.status >= 400) { + return { + ...response, + error: new Error( + `Upload failed for ${filePath} with status code ${response._response.status}`, + ), + }; + } + return { + ...response, + error: undefined, + }; }); }); - let responses: BlobUploadCommonResponse[] = []; + const responses = await Promise.all(promises); - responses = await Promise.all(promises); - - const failed = responses.filter(r => r?._response?.status >= 400); + const failed = responses.filter(r => r.error); if (failed.length === 0) { this.logger.info( - `Successfully uploaded all the generated files for Entity ${entity.metadata.name}. Total number of files: ${allFilesToUpload.length}`, + `Successfully uploaded the ${responses.length} generated file(s) for Entity ${entity.metadata.name}. Total number of files: ${allFilesToUpload.length}`, ); } else { - const errorMessage = `Unable to upload ${failed.length} file(s) to Azure Blob Storage.`; - this.logger.error(errorMessage); + throw new Error( + failed + .map(r => r.error?.message) + .filter(Boolean) + .join(' '), + ); } } catch (e) { - const errorMessage = `Unable to upload file(s) to Azure Blob Storage. Error ${e.message}`; + const errorMessage = `Unable to upload file(s) to Azure Blob Storage. ${e.message}`; this.logger.error(errorMessage); - return; + throw new Error(errorMessage); } } From d1af7b4fbc71622c2cdb7e0903e5805a8191b345 Mon Sep 17 00:00:00 2001 From: Taras Date: Tue, 16 Feb 2021 12:58:26 -0500 Subject: [PATCH 08/12] Remove unnecessary import --- packages/techdocs-common/src/stages/publish/azureBlobStorage.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts index 07e1053b99..7000e9f28c 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts @@ -17,7 +17,6 @@ import platformPath from 'path'; import express from 'express'; import { BlobServiceClient, - BlobUploadCommonResponse, StorageSharedKeyCredential, } from '@azure/storage-blob'; import { DefaultAzureCredential } from '@azure/identity'; From 76db06fa5d730ef6002edaed7a40af0972124449 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Tue, 16 Feb 2021 13:00:14 -0500 Subject: [PATCH 09/12] Update quiet-dots-mix.md --- .changeset/quiet-dots-mix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/quiet-dots-mix.md b/.changeset/quiet-dots-mix.md index a83278671e..b847c040c5 100644 --- a/.changeset/quiet-dots-mix.md +++ b/.changeset/quiet-dots-mix.md @@ -2,4 +2,4 @@ '@backstage/techdocs-common': patch --- -Changed AzureBlobStorage to show errors when upload fails +Improved error reporting in AzureBlobStorage to better surface failures From 8721f06ebea5ef979bd15698e52a244b2feebce8 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Tue, 16 Feb 2021 13:01:35 -0500 Subject: [PATCH 10/12] Update quiet-dots-mix.md --- .changeset/quiet-dots-mix.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.changeset/quiet-dots-mix.md b/.changeset/quiet-dots-mix.md index b847c040c5..97926c9d0f 100644 --- a/.changeset/quiet-dots-mix.md +++ b/.changeset/quiet-dots-mix.md @@ -2,4 +2,5 @@ '@backstage/techdocs-common': patch --- -Improved error reporting in AzureBlobStorage to better surface failures +Improved error reporting in AzureBlobStorage to surface errors when fetching metadata and uploading files fails. + From 874864e38c486e9c45c74aafe639763a48715fc7 Mon Sep 17 00:00:00 2001 From: Taras Date: Tue, 16 Feb 2021 13:12:14 -0500 Subject: [PATCH 11/12] Fix formatting of changeset --- .changeset/quiet-dots-mix.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.changeset/quiet-dots-mix.md b/.changeset/quiet-dots-mix.md index 97926c9d0f..fc4e550afd 100644 --- a/.changeset/quiet-dots-mix.md +++ b/.changeset/quiet-dots-mix.md @@ -3,4 +3,3 @@ --- Improved error reporting in AzureBlobStorage to surface errors when fetching metadata and uploading files fails. - From c6655413db29c70e0984177b0c1f675c582f05ef Mon Sep 17 00:00:00 2001 From: Taras Date: Tue, 16 Feb 2021 13:15:04 -0500 Subject: [PATCH 12/12] Renamed changeset to aply code owners --- .../{quiet-dots-mix.md => techdocs-improve-error-reporting.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .changeset/{quiet-dots-mix.md => techdocs-improve-error-reporting.md} (100%) diff --git a/.changeset/quiet-dots-mix.md b/.changeset/techdocs-improve-error-reporting.md similarity index 100% rename from .changeset/quiet-dots-mix.md rename to .changeset/techdocs-improve-error-reporting.md