Integrate catalog-import with permissions
Signed-off-by: Joon Park <joonp@spotify.com>
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-common': patch
|
||||
---
|
||||
|
||||
Add catalogEntityCreatePermission
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder': patch
|
||||
---
|
||||
|
||||
Permission the Register Existing Component button
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/create-app': patch
|
||||
---
|
||||
|
||||
Permission the catalog-import route
|
||||
@@ -17,6 +17,7 @@
|
||||
"@backstage/plugin-apache-airflow": "^0.1.5-next.0",
|
||||
"@backstage/plugin-badges": "^0.2.21-next.0",
|
||||
"@backstage/plugin-catalog": "^0.7.11-next.0",
|
||||
"@backstage/plugin-catalog-common": "^0.1.1",
|
||||
"@backstage/plugin-catalog-graph": "^0.2.9-next.0",
|
||||
"@backstage/plugin-catalog-import": "^0.8.0-next.0",
|
||||
"@backstage/plugin-catalog-react": "^0.6.13-next.0",
|
||||
@@ -38,6 +39,7 @@
|
||||
"@backstage/plugin-newrelic-dashboard": "^0.1.5-next.0",
|
||||
"@backstage/plugin-org": "^0.4.1-next.0",
|
||||
"@backstage/plugin-pagerduty": "0.3.24-next.0",
|
||||
"@backstage/plugin-permission-react": "^0.3.0",
|
||||
"@backstage/plugin-rollbar": "^0.3.25-next.0",
|
||||
"@backstage/plugin-scaffolder": "^0.12.1-next.0",
|
||||
"@backstage/plugin-search": "^0.6.1-next.0",
|
||||
|
||||
@@ -86,6 +86,8 @@ import * as plugins from './plugins';
|
||||
|
||||
import { techDocsPage } from './components/techdocs/TechDocsPage';
|
||||
import { ApacheAirflowPage } from '@backstage/plugin-apache-airflow';
|
||||
import { PermissionedRoute } from '@backstage/plugin-permission-react';
|
||||
import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';
|
||||
|
||||
const app = createApp({
|
||||
apis,
|
||||
@@ -140,7 +142,11 @@ const routes = (
|
||||
>
|
||||
{entityPage}
|
||||
</Route>
|
||||
<Route path="/catalog-import" element={<CatalogImportPage />} />
|
||||
<PermissionedRoute
|
||||
path="/catalog-import"
|
||||
permission={catalogEntityCreatePermission}
|
||||
element={<CatalogImportPage />}
|
||||
/>
|
||||
<Route
|
||||
path="/catalog-graph"
|
||||
element={
|
||||
|
||||
@@ -49,6 +49,7 @@ import { version as pluginApiDocs } from '../../../../plugins/api-docs/package.j
|
||||
import { version as pluginAppBackend } from '../../../../plugins/app-backend/package.json';
|
||||
import { version as pluginAuthBackend } from '../../../../plugins/auth-backend/package.json';
|
||||
import { version as pluginCatalog } from '../../../../plugins/catalog/package.json';
|
||||
import { version as pluginCatalogCommon } from '../../../../plugins/catalog-common/package.json';
|
||||
import { version as pluginCatalogReact } from '../../../../plugins/catalog-react/package.json';
|
||||
import { version as pluginCatalogBackend } from '../../../../plugins/catalog-backend/package.json';
|
||||
import { version as pluginCatalogGraph } from '../../../../plugins/catalog-graph/package.json';
|
||||
@@ -59,6 +60,7 @@ import { version as pluginGithubActions } from '../../../../plugins/github-actio
|
||||
import { version as pluginLighthouse } from '../../../../plugins/lighthouse/package.json';
|
||||
import { version as pluginOrg } from '../../../../plugins/org/package.json';
|
||||
import { version as pluginPermissionCommon } from '../../../../plugins/permission-common/package.json';
|
||||
import { version as pluginPermissionReact } from '../../../../plugins/permission-react/package.json';
|
||||
import { version as pluginPermissionNode } from '../../../../plugins/permission-node/package.json';
|
||||
import { version as pluginProxyBackend } from '../../../../plugins/proxy-backend/package.json';
|
||||
import { version as pluginRollbarBackend } from '../../../../plugins/rollbar-backend/package.json';
|
||||
@@ -89,6 +91,7 @@ export const packageVersions = {
|
||||
'@backstage/plugin-app-backend': pluginAppBackend,
|
||||
'@backstage/plugin-auth-backend': pluginAuthBackend,
|
||||
'@backstage/plugin-catalog': pluginCatalog,
|
||||
'@backstage/plugin-catalog-common': pluginCatalogCommon,
|
||||
'@backstage/plugin-catalog-react': pluginCatalogReact,
|
||||
'@backstage/plugin-catalog-backend': pluginCatalogBackend,
|
||||
'@backstage/plugin-catalog-graph': pluginCatalogGraph,
|
||||
@@ -100,6 +103,7 @@ export const packageVersions = {
|
||||
'@backstage/plugin-org': pluginOrg,
|
||||
'@backstage/plugin-permission-common': pluginPermissionCommon,
|
||||
'@backstage/plugin-permission-node': pluginPermissionNode,
|
||||
'@backstage/plugin-permission-react': pluginPermissionReact,
|
||||
'@backstage/plugin-proxy-backend': pluginProxyBackend,
|
||||
'@backstage/plugin-rollbar-backend': pluginRollbarBackend,
|
||||
'@backstage/plugin-scaffolder': pluginScaffolder,
|
||||
|
||||
@@ -13,11 +13,13 @@
|
||||
"@backstage/integration-react": "^{{version '@backstage/integration-react'}}",
|
||||
"@backstage/plugin-api-docs": "^{{version '@backstage/plugin-api-docs'}}",
|
||||
"@backstage/plugin-catalog": "^{{version '@backstage/plugin-catalog'}}",
|
||||
"@backstage/plugin-catalog-common": "^{{version '@backstage/plugin-catalog-common'}}",
|
||||
"@backstage/plugin-catalog-graph": "^{{version '@backstage/plugin-catalog-graph'}}",
|
||||
"@backstage/plugin-catalog-import": "^{{version '@backstage/plugin-catalog-import'}}",
|
||||
"@backstage/plugin-catalog-react": "^{{version '@backstage/plugin-catalog-react'}}",
|
||||
"@backstage/plugin-github-actions": "^{{version '@backstage/plugin-github-actions'}}",
|
||||
"@backstage/plugin-org": "^{{version '@backstage/plugin-org'}}",
|
||||
"@backstage/plugin-permission-react": "^{{version '@backstage/plugin-permission-react'}}",
|
||||
"@backstage/plugin-scaffolder": "^{{version '@backstage/plugin-scaffolder'}}",
|
||||
"@backstage/plugin-search": "^{{version '@backstage/plugin-search'}}",
|
||||
"@backstage/plugin-tech-radar": "^{{version '@backstage/plugin-tech-radar'}}",
|
||||
|
||||
@@ -30,6 +30,8 @@ import { AlertDisplay, OAuthRequestDialog } from '@backstage/core-components';
|
||||
import { createApp } from '@backstage/app-defaults';
|
||||
import { FlatRoutes } from '@backstage/core-app-api';
|
||||
import { CatalogGraphPage } from '@backstage/plugin-catalog-graph';
|
||||
import { PermissionedRoute } from '@backstage/plugin-permission-react';
|
||||
import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';
|
||||
|
||||
const app = createApp({
|
||||
apis,
|
||||
@@ -76,7 +78,11 @@ const routes = (
|
||||
path="/tech-radar"
|
||||
element={<TechRadarPage width={1500} height={800} />}
|
||||
/>
|
||||
<Route path="/catalog-import" element={<CatalogImportPage />} />
|
||||
<PermissionedRoute
|
||||
path="/catalog-import"
|
||||
permission={catalogEntityCreatePermission}
|
||||
element={<CatalogImportPage />}
|
||||
/>
|
||||
<Route path="/search" element={<SearchPage />}>
|
||||
{searchPage}
|
||||
</Route>
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
```ts
|
||||
import { Permission } from '@backstage/plugin-permission-common';
|
||||
|
||||
// @public
|
||||
export const catalogEntityCreatePermission: Permission;
|
||||
|
||||
// @public
|
||||
export const catalogEntityDeletePermission: Permission;
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
export {
|
||||
RESOURCE_TYPE_CATALOG_ENTITY,
|
||||
catalogEntityReadPermission,
|
||||
catalogEntityCreatePermission,
|
||||
catalogEntityDeletePermission,
|
||||
catalogEntityRefreshPermission,
|
||||
catalogLocationReadPermission,
|
||||
|
||||
@@ -38,6 +38,20 @@ export const catalogEntityReadPermission: Permission = {
|
||||
resourceType: RESOURCE_TYPE_CATALOG_ENTITY,
|
||||
};
|
||||
|
||||
/**
|
||||
* This permission is used to authorize actions that involve creating a new
|
||||
* catalog entity. This includes registering an existing component into the
|
||||
* catalog.
|
||||
* @public
|
||||
*/
|
||||
export const catalogEntityCreatePermission: Permission = {
|
||||
name: 'catalog.entity.create',
|
||||
attributes: {
|
||||
action: 'create',
|
||||
},
|
||||
resourceType: RESOURCE_TYPE_CATALOG_ENTITY,
|
||||
};
|
||||
|
||||
/**
|
||||
* This permission is used to designate actions that involve removing one or
|
||||
* more entities from the catalog.
|
||||
|
||||
@@ -39,7 +39,9 @@
|
||||
"@backstage/errors": "^0.2.0",
|
||||
"@backstage/integration": "^0.7.2",
|
||||
"@backstage/integration-react": "^0.1.20-next.0",
|
||||
"@backstage/plugin-catalog-common": "^0.1.1",
|
||||
"@backstage/plugin-catalog-react": "^0.6.13-next.0",
|
||||
"@backstage/plugin-permission-react": "^0.3.0",
|
||||
"@backstage/plugin-scaffolder-common": "^0.1.3",
|
||||
"@backstage/theme": "^0.2.14",
|
||||
"@backstage/types": "^0.1.1",
|
||||
|
||||
@@ -37,6 +37,8 @@ import React, { ComponentType } from 'react';
|
||||
import { registerComponentRouteRef } from '../../routes';
|
||||
import { TemplateList } from '../TemplateList';
|
||||
import { TemplateTypePicker } from '../TemplateTypePicker';
|
||||
import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';
|
||||
import { usePermission } from '@backstage/plugin-permission-react';
|
||||
|
||||
const useStyles = makeStyles(theme => ({
|
||||
contentWrapper: {
|
||||
@@ -72,6 +74,8 @@ export const ScaffolderPageContents = ({
|
||||
},
|
||||
};
|
||||
|
||||
const { allowed } = usePermission(catalogEntityCreatePermission);
|
||||
|
||||
return (
|
||||
<Page themeId="home">
|
||||
<Header
|
||||
@@ -85,10 +89,12 @@ export const ScaffolderPageContents = ({
|
||||
/>
|
||||
<Content>
|
||||
<ContentHeader title="Available Templates">
|
||||
<CreateButton
|
||||
title="Register Existing Component"
|
||||
to={registerComponentLink && registerComponentLink()}
|
||||
/>
|
||||
{allowed && (
|
||||
<CreateButton
|
||||
title="Register Existing Component"
|
||||
to={registerComponentLink && registerComponentLink()}
|
||||
/>
|
||||
)}
|
||||
<SupportButton>
|
||||
Create new software components using standard templates. Different
|
||||
templates create different kinds of components (services, websites,
|
||||
|
||||
Reference in New Issue
Block a user