From 115473c085083bf1d3b2f20280960ac05900296b Mon Sep 17 00:00:00 2001 From: Mustansar Anwar ul Samad Date: Wed, 23 Jun 2021 18:12:01 +1200 Subject: [PATCH] Handle error gracefully on msgraph api photo load Signed-off-by: Mustansar Anwar ul Samad --- .changeset/fair-dolphins-relate.md | 5 +++++ .../package.json | 1 + .../src/microsoftGraph/read.test.ts | 3 ++- .../src/microsoftGraph/read.ts | 22 +++++++++++++------ .../MicrosoftGraphOrgReaderProcessor.ts | 1 + 5 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 .changeset/fair-dolphins-relate.md diff --git a/.changeset/fair-dolphins-relate.md b/.changeset/fair-dolphins-relate.md new file mode 100644 index 0000000000..dcc14cd17f --- /dev/null +++ b/.changeset/fair-dolphins-relate.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-msgraph': patch +--- + +Handle error gracefully if failure occurs while loading photos using Microsoft Graph API diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index f37b954706..4d60949b22 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -29,6 +29,7 @@ }, "dependencies": { "@azure/msal-node": "^1.1.0", + "@backstage/backend-common": "^0.8.3", "@backstage/catalog-model": "^0.8.4", "@backstage/config": "^0.1.5", "@backstage/plugin-catalog-backend": "^0.10.4", diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.test.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.test.ts index b1179c20df..a7f24b41ad 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.test.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.test.ts @@ -23,6 +23,7 @@ import { readMicrosoftGraphUsers, resolveRelations, } from './read'; +import { getVoidLogger } from '@backstage/backend-common'; function user(data: Partial): UserEntity { return merge( @@ -82,7 +83,7 @@ describe('read microsoft graph', () => { 'data:image/jpeg;base64,...', ); - const { users } = await readMicrosoftGraphUsers(client, { + const { users } = await readMicrosoftGraphUsers(getVoidLogger(), client, { userFilter: 'accountEnabled eq true', }); diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts index 70c403d0b7..8af15605e7 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/read.ts @@ -33,6 +33,7 @@ import { OrganizationTransformer, UserTransformer, } from './types'; +import { Logger } from 'winston'; export async function defaultUserTransformer( user: MicrosoftGraph.User, @@ -74,6 +75,7 @@ export async function defaultUserTransformer( } export async function readMicrosoftGraphUsers( + logger: Logger, client: MicrosoftGraphClient, options?: { userFilter?: string; transformer?: UserTransformer }, ): Promise<{ @@ -91,12 +93,17 @@ export async function readMicrosoftGraphUsers( // Process all users in parallel, otherwise it can take quite some time promises.push( limiter(async () => { - const userPhoto = await client.getUserPhotoWithSizeLimit( - user.id!, - // We are limiting the photo size, as users with full resolution photos - // can make the Backstage API slow - 120, - ); + let userPhoto; + try { + userPhoto = await client.getUserPhotoWithSizeLimit( + user.id!, + // We are limiting the photo size, as users with full resolution photos + // can make the Backstage API slow + 120, + ); + } catch (e) { + logger.warn(`Unable to load photo for ${user.id}`); + } const entity = await transformer(user, userPhoto); @@ -369,6 +376,7 @@ export function resolveRelations( } export async function readMicrosoftGraphOrg( + logger: Logger, client: MicrosoftGraphClient, tenantId: string, options?: { @@ -377,7 +385,7 @@ export async function readMicrosoftGraphOrg( groupTransformer?: GroupTransformer; }, ): Promise<{ users: UserEntity[]; groups: GroupEntity[] }> { - const { users } = await readMicrosoftGraphUsers(client, { + const { users } = await readMicrosoftGraphUsers(logger, client, { userFilter: options?.userFilter, }); const { diff --git a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts index d86584a9fd..3e5203d3a5 100644 --- a/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts +++ b/plugins/catalog-backend-module-msgraph/src/processors/MicrosoftGraphOrgReaderProcessor.ts @@ -84,6 +84,7 @@ export class MicrosoftGraphOrgReaderProcessor implements CatalogProcessor { // We create a client each time as we need one that matches the specific provider const client = MicrosoftGraphClient.create(provider); const { users, groups } = await readMicrosoftGraphOrg( + this.logger, client, provider.tenantId, {