change plugin name back to azure-functions. apply PR feedback

Signed-off-by: Wesley Pattison <wesley.pattison@friss.com>
This commit is contained in:
Wesley Pattison
2022-09-26 12:00:32 +02:00
parent 27776508ea
commit fb6eb274f5
43 changed files with 137 additions and 110 deletions
+4 -4
View File
@@ -1,7 +1,7 @@
---
'@backstage/plugin-azure': minor
'@backstage/plugin-azure-backend': minor
'@backstage/plugin-azure-common': minor
'@backstage/plugin-azure-functions': minor
'@backstage/plugin-azure-functions-backend': minor
'@backstage/plugin-azure-functions-common': minor
---
Generic azure plugin based on an annotation supplied by a given entity.
Basic Azure Functions support for a given entity. View the current status of the function app, quickly jump to Function's Overview page, or Log Stream page.
@@ -4,6 +4,6 @@ author: FRISS
authorUrl: https://friss.com
category: Infrastructure
description: View related Azure information for your components in Backstage.
documentation: https://github.com/backstage/backstage/tree/master/plugins/azure
iconUrl: img/azure-icon.svg
npmPackageName: '@backstage/plugin-azure'
documentation: https://github.com/backstage/backstage/tree/master/plugins/azure-functions
iconUrl: img/azurefunctions-icon.svg
npmPackageName: '@backstage/plugin-azure-functions'
+1 -1
View File
@@ -18,8 +18,8 @@
"@backstage/plugin-airbrake": "^0.3.9",
"@backstage/plugin-apache-airflow": "^0.2.2",
"@backstage/plugin-api-docs": "^0.8.9",
"@backstage/plugin-azure": "^0.0.0",
"@backstage/plugin-azure-devops": "^0.2.0",
"@backstage/plugin-azure-functions": "^0.0.0",
"@backstage/plugin-badges": "^0.2.33",
"@backstage/plugin-catalog-common": "^1.0.6",
"@backstage/plugin-catalog-graph": "^0.2.21",
+1 -1
View File
@@ -35,8 +35,8 @@
"@backstage/plugin-app-backend": "^0.3.36",
"@backstage/plugin-auth-backend": "^0.16.0",
"@backstage/plugin-auth-node": "^0.2.5",
"@backstage/plugin-azure-backend": "^0.0.0",
"@backstage/plugin-azure-devops-backend": "^0.3.15",
"@backstage/plugin-azure-functions-backend": "^0.0.0",
"@backstage/plugin-badges-backend": "^0.1.30",
"@backstage/plugin-catalog-backend": "^1.4.0",
"@backstage/plugin-code-coverage-backend": "^0.2.2",
@@ -33,11 +33,11 @@ Configuration Details:
Here's how to get the backend plugin up and running:
1. First we need to add the `@backstage/plugin-azure-backend` package to your backend:
1. First we need to add the `@backstage/plugin-azure-functions-backend` package to your backend:
```sh
# From the Backstage root directory
yarn add --cwd packages/backend @backstage/plugin-azure-backend
yarn add --cwd packages/backend @backstage/plugin-azure-functions-backend
```
2. Then we will create a new file named `packages/backend/src/plugins/azure.ts`, and add the following to it:
@@ -46,7 +46,7 @@ Here's how to get the backend plugin up and running:
import {
createRouter,
AzureSitesApi,
} from '@backstage/plugin-azure-backend';
} from '@backstage/plugin-azure-functions-backend';
import { Router } from 'express';
import { PluginEnvironment } from '../types';
@@ -1,15 +1,16 @@
## API Report File for "@backstage/plugin-azure-backend"
## API Report File for "@backstage/plugin-azure-functions-backend"
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
import { AzureSiteListRequest } from '@backstage/plugin-azure-functions-common';
import { AzureSiteListResponse } from '@backstage/plugin-azure-functions-common';
import { Config } from '@backstage/config';
import express from 'express';
import { Logger } from 'winston';
import { SiteList } from '@backstage/plugin-azure-common';
// @public (undocumented)
export class AzureConfig {
export class AzureFunctionsConfig {
constructor(
domain: string,
tenantId: string,
@@ -24,7 +25,7 @@ export class AzureConfig {
// (undocumented)
readonly domain: string;
// (undocumented)
static fromConfig(config: Config): AzureConfig;
static fromConfig(config: Config): AzureFunctionsConfig;
// (undocumented)
readonly subscriptions?: string[] | undefined;
// (undocumented)
@@ -33,11 +34,11 @@ export class AzureConfig {
// @public (undocumented)
export class AzureSitesApi {
constructor(config: AzureConfig);
constructor(config: AzureFunctionsConfig);
// (undocumented)
static fromConfig(config: Config): AzureSitesApi;
// (undocumented)
list({ name }: { name: string }): Promise<SiteList>;
list(request: AzureSiteListRequest): Promise<AzureSiteListResponse>;
}
// @public (undocumented)
@@ -1,5 +1,5 @@
{
"name": "@backstage/plugin-azure-backend",
"name": "@backstage/plugin-azure-functions-backend",
"version": "0.0.0",
"main": "src/index.ts",
"types": "src/index.ts",
@@ -17,7 +17,7 @@
"repository": {
"type": "git",
"url": "https://github.com/backstage/backstage",
"directory": "plugins/azure-backend"
"directory": "plugins/azure-functions-backend"
},
"keywords": [
"backstage",
@@ -37,7 +37,7 @@
"@azure/identity": "^2.1.0",
"@backstage/backend-common": "^0.15.1",
"@backstage/config": "^1.0.2",
"@backstage/plugin-azure-common": "^0.0.0",
"@backstage/plugin-azure-functions-common": "^0.0.0",
"@types/express": "^4.17.6",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
@@ -15,7 +15,7 @@
*/
export interface Config {
azure: {
azureFunctions: {
/** @visibility backend */
domain: string;
/** @visibility backend */
@@ -20,8 +20,12 @@ import {
ClientSecretCredential,
} from '@azure/identity';
import { ResourceGraphClient } from '@azure/arm-resourcegraph';
import { Site, SiteList } from '@backstage/plugin-azure-common';
import { AzureConfig } from '../config';
import {
AzureSite,
AzureSiteListRequest,
AzureSiteListResponse,
} from '@backstage/plugin-azure-functions-common';
import { AzureFunctionsConfig } from '../config';
/** @public */
export class AzureSitesApi {
@@ -29,7 +33,7 @@ export class AzureSitesApi {
`https://portal.azure.com/#@${domain}/resource`;
private readonly client: ResourceGraphClient;
constructor(private readonly config: AzureConfig) {
constructor(private readonly config: AzureFunctionsConfig) {
const creds =
config.clientId && config.clientSecret
? new ClientSecretCredential(
@@ -43,14 +47,14 @@ export class AzureSitesApi {
}
static fromConfig(config: Config): AzureSitesApi {
return new AzureSitesApi(AzureConfig.fromConfig(config));
return new AzureSitesApi(AzureFunctionsConfig.fromConfig(config));
}
async list({ name }: { name: string }): Promise<SiteList> {
const items: Site[] = [];
async list(request: AzureSiteListRequest): Promise<AzureSiteListResponse> {
const items: AzureSite[] = [];
try {
const result = await this.client.resources({
query: `resources | where type == 'microsoft.web/sites' | where name contains '${name}'`,
query: `resources | where type == 'microsoft.web/sites' | where name contains '${request.name}'`,
subscriptions: this.config.subscriptions,
});
for (const v of result.data) {
@@ -70,8 +74,8 @@ export class AzureSitesApi {
tags: v.properties.tags!,
});
}
} catch (ex) {
console.log(ex);
} catch (ex: any) {
throw ex;
}
return { items: items };
}
@@ -17,7 +17,7 @@
import { Config } from '@backstage/config';
/** @public */
export class AzureConfig {
export class AzureFunctionsConfig {
constructor(
public readonly domain: string,
public readonly tenantId: string,
@@ -26,10 +26,10 @@ export class AzureConfig {
public readonly clientSecret?: string,
) {}
static fromConfig(config: Config): AzureConfig {
const azConfig = config.getConfig('azure');
static fromConfig(config: Config): AzureFunctionsConfig {
const azConfig = config.getConfig('azureFunctions');
return new AzureConfig(
return new AzureFunctionsConfig(
azConfig.getString('domain'),
azConfig.getString('tenantId'),
azConfig
@@ -1,10 +1,10 @@
## API Report File for "@backstage/plugin-azure-common"
## API Report File for "@backstage/plugin-azure-functions-common"
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
// @public (undocumented)
export type Site = {
export type AzureSite = {
href: string;
logstreamHref: string;
name: string;
@@ -19,8 +19,13 @@ export type Site = {
};
// @public (undocumented)
export type SiteList = {
items: Site[];
export type AzureSiteListRequest = {
name: string;
};
// @public (undocumented)
export type AzureSiteListResponse = {
items: AzureSite[];
};
// (No @packageDocumentation comment for this package)
@@ -1,5 +1,5 @@
{
"name": "@backstage/plugin-azure-common",
"name": "@backstage/plugin-azure-functions-common",
"description": "Common functionalities for the azure plugin",
"version": "0.0.0",
"main": "src/index.ts",
@@ -18,7 +18,7 @@
"repository": {
"type": "git",
"url": "https://github.com/backstage/backstage",
"directory": "plugins/azure-common"
"directory": "plugins/azure-functions-common"
},
"keywords": [
"backstage"
@@ -15,7 +15,7 @@
*/
/** @public */
export type Site = {
export type AzureSite = {
href: string;
logstreamHref: string;
name: string;
@@ -30,6 +30,11 @@ export type Site = {
};
/** @public */
export type SiteList = {
items: Site[];
export type AzureSiteListRequest = {
name: string;
};
/** @public */
export type AzureSiteListResponse = {
items: AzureSite[];
};
@@ -47,14 +47,14 @@ azure.com/microsoft.web/sites: func-testapp
1. Install the plugin in the `packages/app` directory
```sh
yarn add @backstage/plugin-azure
yarn add @backstage/plugin-azure-functions
```
2. Add widget component to your Backstage instance:
```ts
// In packages/app/src/components/catalog/EntityPage.tsx
import { EntityAzureSitesOverviewWidget, isAzureWebSiteNameAvailable } from '@backstage/plugin-azure';
import { EntityAzureSitesOverviewWidget, isAzureWebSiteNameAvailable } from '@backstage/plugin-azure-functions';
...
@@ -1,4 +1,4 @@
## API Report File for "@backstage/plugin-azure"
## API Report File for "@backstage/plugin-azure-functions"
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
@@ -6,19 +6,20 @@
/// <reference types="react" />
import { ApiRef } from '@backstage/core-plugin-api';
import { AzureSiteListRequest } from '@backstage/plugin-azure-functions-common';
import { AzureSiteListResponse } from '@backstage/plugin-azure-functions-common';
import { BackstagePlugin } from '@backstage/core-plugin-api';
import { DiscoveryApi } from '@backstage/core-plugin-api';
import { Entity } from '@backstage/catalog-model';
import { IdentityApi } from '@backstage/core-plugin-api';
import { RouteRef } from '@backstage/core-plugin-api';
import { SiteList } from '@backstage/plugin-azure-common';
// @public (undocumented)
export const azureSiteApiRef: ApiRef<AzureSitesApi>;
// @public (undocumented)
export type AzureSitesApi = {
list: ({ name }: { name: string }) => Promise<SiteList>;
list: (request: AzureSiteListRequest) => Promise<AzureSiteListResponse>;
};
// @public (undocumented)
@@ -28,7 +29,7 @@ export class AzureSitesApiBackendClient implements AzureSitesApi {
identityApi: IdentityApi;
});
// (undocumented)
list({ name }: { name: string }): Promise<SiteList>;
list(request: AzureSiteListRequest): Promise<AzureSiteListResponse>;
}
// @public (undocumented)

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

@@ -1,5 +1,5 @@
{
"name": "@backstage/plugin-azure",
"name": "@backstage/plugin-azure-functions",
"version": "0.0.0",
"main": "src/index.ts",
"types": "src/index.ts",
@@ -17,7 +17,7 @@
"repository": {
"type": "git",
"url": "https://github.com/backstage/backstage",
"directory": "plugins/azure"
"directory": "plugins/azure-functions"
},
"keywords": [
"backstage",
@@ -36,7 +36,7 @@
"@backstage/catalog-model": "^1.1.1",
"@backstage/core-components": "^0.11.1",
"@backstage/core-plugin-api": "^1.0.6",
"@backstage/plugin-azure-common": "^0.0.0",
"@backstage/plugin-azure-functions-common": "^0.0.0",
"@backstage/plugin-catalog-react": "^1.1.4",
"@backstage/theme": "^0.2.16",
"@material-ui/core": "^4.12.2",
@@ -15,7 +15,10 @@
*/
import { createApiRef } from '@backstage/core-plugin-api';
import { SiteList } from '@backstage/plugin-azure-common';
import {
AzureSiteListRequest,
AzureSiteListResponse,
} from '@backstage/plugin-azure-functions-common';
/** @public */
export const azureSiteApiRef = createApiRef<AzureSitesApi>({
@@ -24,5 +27,5 @@ export const azureSiteApiRef = createApiRef<AzureSitesApi>({
/** @public */
export type AzureSitesApi = {
list: ({ name }: { name: string }) => Promise<SiteList>;
list: (request: AzureSiteListRequest) => Promise<AzureSiteListResponse>;
};
@@ -15,7 +15,10 @@
*/
import { AzureSitesApi } from './AzureSitesApi';
import { SiteList } from '@backstage/plugin-azure-common';
import {
AzureSiteListRequest,
AzureSiteListResponse,
} from '@backstage/plugin-azure-functions-common';
import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api';
/** @public */
@@ -30,9 +33,11 @@ export class AzureSitesApiBackendClient implements AzureSitesApi {
this.identityApi = options.identityApi;
}
async list({ name }: { name: string }): Promise<SiteList> {
async list(request: AzureSiteListRequest): Promise<AzureSiteListResponse> {
try {
const url = `${await this.discoveryApi.getBaseUrl('azure')}/list/${name}`;
const url = `${await this.discoveryApi.getBaseUrl('azure')}/list/${
request.name
}`;
const { token: accessToken } = await this.identityApi.getCredentials();
const response = await fetch(url, {
method: 'GET',
@@ -43,7 +48,7 @@ export class AzureSitesApiBackendClient implements AzureSitesApi {
});
return await response.json();
} catch (e: any) {
throw new Error('MissingAzureBackendException');
throw new Error(e);
}
}
}
@@ -16,7 +16,7 @@
import React from 'react';
import { Box, Card, Link, LinearProgress } from '@material-ui/core';
import { Site } from '@backstage/plugin-azure-common';
import { AzureSite } from '@backstage/plugin-azure-functions-common';
import { Table, TableColumn } from '@backstage/core-components';
import FlashOnIcon from '@material-ui/icons/FlashOn';
import { DateTime } from 'luxon';
@@ -48,15 +48,15 @@ const State = ({ value }: { value: States }) => {
};
type TableProps = {
data: Site[];
data: AzureSite[];
loading: boolean;
};
const DEFAULT_COLUMNS: TableColumn<Site>[] = [
const DEFAULT_COLUMNS: TableColumn<AzureSite>[] = [
{
title: 'name',
highlight: true,
render: (func: Site) => {
render: (func: AzureSite) => {
return (
<Link href={func.href} target="_blank">
{func.name}
@@ -66,19 +66,19 @@ const DEFAULT_COLUMNS: TableColumn<Site>[] = [
},
{
title: 'kind',
render: (func: Site) => func.kind ?? 'unknown',
render: (func: AzureSite) => func.kind ?? 'unknown',
},
{
title: 'location',
render: (func: Site) => func.location ?? 'unknown',
render: (func: AzureSite) => func.location ?? 'unknown',
},
{
title: 'status',
render: (func: Site) => <State value={func.state as States} />,
render: (func: AzureSite) => <State value={func.state as States} />,
},
{
title: 'last modified',
render: (func: Site) =>
render: (func: AzureSite) =>
DateTime.fromISO(func.lastModifiedDate).toLocaleString(
DateTime.DATETIME_MED,
),
@@ -86,7 +86,7 @@ const DEFAULT_COLUMNS: TableColumn<Site>[] = [
{
title: 'logs',
align: 'right',
render: (func: Site) => {
render: (func: AzureSite) => {
return (
<Link href={func.logstreamHref} target="_blank">
View Logs
@@ -98,7 +98,7 @@ const DEFAULT_COLUMNS: TableColumn<Site>[] = [
/** @public */
export const AzureSitesOverviewTable = ({ data, loading }: TableProps) => {
const columns: TableColumn<Site>[] = [...DEFAULT_COLUMNS];
const columns: TableColumn<AzureSite>[] = [...DEFAULT_COLUMNS];
const tableStyle = {
minWidth: '0',
width: '100%',
@@ -16,7 +16,7 @@
import useAsyncRetry from 'react-use/lib/useAsyncRetry';
import { useApi, errorApiRef } from '@backstage/core-plugin-api';
import { SiteList } from '@backstage/plugin-azure-common';
import { AzureSiteListResponse } from '@backstage/plugin-azure-functions-common';
import { azureSiteApiRef } from '../api';
import { useCallback } from 'react';
@@ -37,15 +37,18 @@ export function useSites({ name }: { name: string }) {
value: data,
error,
retry,
} = useAsyncRetry<SiteList | null>(async () => {
} = useAsyncRetry<AzureSiteListResponse | null>(async () => {
try {
const sites = await list();
return sites;
} catch (e) {
if (e instanceof Error) {
if (e?.message === 'MissingAzureBackendException') {
errorApi.post(new Error('Please add azure-backend plugin'));
return null;
if (e?.message === 'AbortError') {
errorApi.post(
new Error(
'Timeout reaching backend plugin, please add azure-backend plugin',
),
);
}
errorApi.post(e);
}
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import { Site } from '@backstage/plugin-azure-common';
import { AzureSite } from '@backstage/plugin-azure-functions-common';
export const entityMock = {
metadata: {
@@ -36,7 +36,7 @@ export const entityMock = {
};
// https://management.azure.com/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.Web/sites/{{functionsName}}?api-version=2022-03-01
export const siteMock: Site = {
export const siteMock: AzureSite = {
name: 'func-mock',
kind: 'functionapp',
resourceGroup: 'mock-resourcegroup',
+34 -34
View File
@@ -3946,35 +3946,6 @@ __metadata:
languageName: unknown
linkType: soft
"@backstage/plugin-azure-backend@^0.0.0, @backstage/plugin-azure-backend@workspace:plugins/azure-backend":
version: 0.0.0-use.local
resolution: "@backstage/plugin-azure-backend@workspace:plugins/azure-backend"
dependencies:
"@azure/arm-resourcegraph": ^4.2.1
"@azure/identity": ^2.1.0
"@backstage/backend-common": ^0.15.1
"@backstage/cli": ^0.19.0
"@backstage/config": ^1.0.2
"@backstage/plugin-azure-common": ^0.0.0
"@types/express": ^4.17.6
"@types/supertest": ^2.0.8
express: ^4.17.1
express-promise-router: ^4.1.0
msw: ^0.47.0
node-fetch: ^2.6.7
winston: ^3.2.1
yn: ^4.0.0
languageName: unknown
linkType: soft
"@backstage/plugin-azure-common@^0.0.0, @backstage/plugin-azure-common@workspace:plugins/azure-common":
version: 0.0.0-use.local
resolution: "@backstage/plugin-azure-common@workspace:plugins/azure-common"
dependencies:
"@backstage/cli": ^0.19.0
languageName: unknown
linkType: soft
"@backstage/plugin-azure-devops-backend@^0.3.15, @backstage/plugin-azure-devops-backend@workspace:plugins/azure-devops-backend":
version: 0.0.0-use.local
resolution: "@backstage/plugin-azure-devops-backend@workspace:plugins/azure-devops-backend"
@@ -4038,9 +4009,38 @@ __metadata:
languageName: unknown
linkType: soft
"@backstage/plugin-azure@^0.0.0, @backstage/plugin-azure@workspace:plugins/azure":
"@backstage/plugin-azure-functions-backend@^0.0.0, @backstage/plugin-azure-functions-backend@workspace:plugins/azure-functions-backend":
version: 0.0.0-use.local
resolution: "@backstage/plugin-azure@workspace:plugins/azure"
resolution: "@backstage/plugin-azure-functions-backend@workspace:plugins/azure-functions-backend"
dependencies:
"@azure/arm-resourcegraph": ^4.2.1
"@azure/identity": ^2.1.0
"@backstage/backend-common": ^0.15.1
"@backstage/cli": ^0.19.0
"@backstage/config": ^1.0.2
"@backstage/plugin-azure-functions-common": ^0.0.0
"@types/express": ^4.17.6
"@types/supertest": ^2.0.8
express: ^4.17.1
express-promise-router: ^4.1.0
msw: ^0.47.0
node-fetch: ^2.6.7
winston: ^3.2.1
yn: ^4.0.0
languageName: unknown
linkType: soft
"@backstage/plugin-azure-functions-common@^0.0.0, @backstage/plugin-azure-functions-common@workspace:plugins/azure-functions-common":
version: 0.0.0-use.local
resolution: "@backstage/plugin-azure-functions-common@workspace:plugins/azure-functions-common"
dependencies:
"@backstage/cli": ^0.19.0
languageName: unknown
linkType: soft
"@backstage/plugin-azure-functions@^0.0.0, @backstage/plugin-azure-functions@workspace:plugins/azure-functions":
version: 0.0.0-use.local
resolution: "@backstage/plugin-azure-functions@workspace:plugins/azure-functions"
dependencies:
"@backstage/catalog-model": ^1.1.1
"@backstage/cli": ^0.19.0
@@ -4048,7 +4048,7 @@ __metadata:
"@backstage/core-components": ^0.11.1
"@backstage/core-plugin-api": ^1.0.6
"@backstage/dev-utils": ^1.0.6
"@backstage/plugin-azure-common": ^0.0.0
"@backstage/plugin-azure-functions-common": ^0.0.0
"@backstage/plugin-catalog-react": ^1.1.4
"@backstage/test-utils": ^1.2.0
"@backstage/theme": ^0.2.16
@@ -22401,8 +22401,8 @@ __metadata:
"@backstage/plugin-airbrake": ^0.3.9
"@backstage/plugin-apache-airflow": ^0.2.2
"@backstage/plugin-api-docs": ^0.8.9
"@backstage/plugin-azure": ^0.0.0
"@backstage/plugin-azure-devops": ^0.2.0
"@backstage/plugin-azure-functions": ^0.0.0
"@backstage/plugin-badges": ^0.2.33
"@backstage/plugin-catalog-common": ^1.0.6
"@backstage/plugin-catalog-graph": ^0.2.21
@@ -22506,8 +22506,8 @@ __metadata:
"@backstage/plugin-app-backend": ^0.3.36
"@backstage/plugin-auth-backend": ^0.16.0
"@backstage/plugin-auth-node": ^0.2.5
"@backstage/plugin-azure-backend": ^0.0.0
"@backstage/plugin-azure-devops-backend": ^0.3.15
"@backstage/plugin-azure-functions-backend": ^0.0.0
"@backstage/plugin-badges-backend": ^0.1.30
"@backstage/plugin-catalog-backend": ^1.4.0
"@backstage/plugin-code-coverage-backend": ^0.2.2