diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 12b7dcad21..78ff79e43b 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -47,6 +47,7 @@ "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", "@backstage/plugin-kubernetes-react": "workspace:^", + "@backstage/plugin-permission-react": "workspace:^", "@kubernetes-models/apimachinery": "^2.0.0", "@kubernetes-models/base": "^5.0.0", "@material-ui/core": "^4.12.2", diff --git a/plugins/kubernetes-cluster/src/components/KubernetesClusterContent/KubernetesClusterContent.tsx b/plugins/kubernetes-cluster/src/components/KubernetesClusterContent/KubernetesClusterContent.tsx index c46ac4c8e2..d005a6a2aa 100644 --- a/plugins/kubernetes-cluster/src/components/KubernetesClusterContent/KubernetesClusterContent.tsx +++ b/plugins/kubernetes-cluster/src/components/KubernetesClusterContent/KubernetesClusterContent.tsx @@ -24,6 +24,8 @@ import { useKubernetesClusterError, } from '../KubernetesClusterErrorContext/KubernetesClusterErrorContext'; import { WarningPanel } from '@backstage/core-components'; +import { useKubernetesClustersPermission } from '../../hooks/useKubernetesClustersPermission'; +import { kubernetesClustersPermission } from '@backstage/plugin-kubernetes-common'; const ContentGrid = () => { const { error } = useKubernetesClusterError(); @@ -57,7 +59,15 @@ const ContentGrid = () => { * @public */ export const KubernetesClusterContent = () => { - return ( + const hasKubernetesClustersPermission = useKubernetesClustersPermission(); + + return !hasKubernetesClustersPermission ? ( + + ) : ( diff --git a/plugins/kubernetes-cluster/src/hooks/useKubernetesClustersPermission.ts b/plugins/kubernetes-cluster/src/hooks/useKubernetesClustersPermission.ts new file mode 100644 index 0000000000..4b71d381f6 --- /dev/null +++ b/plugins/kubernetes-cluster/src/hooks/useKubernetesClustersPermission.ts @@ -0,0 +1,26 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { kubernetesClustersPermission } from '@backstage/plugin-kubernetes-common'; +import { usePermission } from '@backstage/plugin-permission-react'; + +export const useKubernetesClustersPermission = () => { + const kubernetesClustersPermissionResult = usePermission({ + permission: kubernetesClustersPermission, + }); + + return kubernetesClustersPermissionResult.allowed; +}; diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index c42471e331..9dbc2c2c6a 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -66,6 +66,7 @@ "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-kubernetes-common": "workspace:^", "@backstage/plugin-kubernetes-react": "workspace:^", + "@backstage/plugin-permission-react": "workspace:^", "@kubernetes-models/apimachinery": "^2.0.0", "@kubernetes-models/base": "^5.0.0", "@kubernetes/client-node": "1.0.0-rc7", diff --git a/plugins/kubernetes/src/KubernetesContent.tsx b/plugins/kubernetes/src/KubernetesContent.tsx index acd1ecc521..f9bde67f62 100644 --- a/plugins/kubernetes/src/KubernetesContent.tsx +++ b/plugins/kubernetes/src/KubernetesContent.tsx @@ -28,13 +28,18 @@ import { import { DetectedError, detectErrors, + kubernetesClustersPermission, + kubernetesResourcesPermission, } from '@backstage/plugin-kubernetes-common'; import { Content, EmptyState, Page, Progress, + WarningPanel, } from '@backstage/core-components'; +import { useKubernetesClustersPermission } from './hooks/useKubernetesClustersPermission'; +import { useKubernetesResourcesPermission } from './hooks/useKubernetesResourcesPermission'; type KubernetesContentProps = { entity: Entity; @@ -46,11 +51,27 @@ export const KubernetesContent = ({ entity, refreshIntervalMs, }: KubernetesContentProps) => { + const hasKubernetesClustersPermission = useKubernetesClustersPermission(); + const hasKubernetesResourcesPermission = useKubernetesResourcesPermission(); const { kubernetesObjects, error } = useKubernetesObjects( entity, refreshIntervalMs, ); + if (!hasKubernetesClustersPermission || !hasKubernetesResourcesPermission) { + return ( + + + + + + ); + } + const clusters = kubernetesObjects?.items.map(item => item.cluster) ?? []; const clustersWithErrors = diff --git a/plugins/kubernetes/src/hooks/useKubernetesClustersPermission.ts b/plugins/kubernetes/src/hooks/useKubernetesClustersPermission.ts new file mode 100644 index 0000000000..4b71d381f6 --- /dev/null +++ b/plugins/kubernetes/src/hooks/useKubernetesClustersPermission.ts @@ -0,0 +1,26 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { kubernetesClustersPermission } from '@backstage/plugin-kubernetes-common'; +import { usePermission } from '@backstage/plugin-permission-react'; + +export const useKubernetesClustersPermission = () => { + const kubernetesClustersPermissionResult = usePermission({ + permission: kubernetesClustersPermission, + }); + + return kubernetesClustersPermissionResult.allowed; +}; diff --git a/plugins/kubernetes/src/hooks/useKubernetesResourcesPermission.ts b/plugins/kubernetes/src/hooks/useKubernetesResourcesPermission.ts new file mode 100644 index 0000000000..d5d730f39b --- /dev/null +++ b/plugins/kubernetes/src/hooks/useKubernetesResourcesPermission.ts @@ -0,0 +1,26 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { kubernetesResourcesPermission } from '@backstage/plugin-kubernetes-common'; +import { usePermission } from '@backstage/plugin-permission-react'; + +export const useKubernetesResourcesPermission = () => { + const kubernetesResourcesPermissionResult = usePermission({ + permission: kubernetesResourcesPermission, + }); + + return kubernetesResourcesPermissionResult.allowed; +}; diff --git a/yarn.lock b/yarn.lock index e212f245b1..0cffefeeb9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6740,6 +6740,7 @@ __metadata: "@backstage/plugin-catalog-react": "workspace:^" "@backstage/plugin-kubernetes-common": "workspace:^" "@backstage/plugin-kubernetes-react": "workspace:^" + "@backstage/plugin-permission-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@kubernetes-models/apimachinery": ^2.0.0 "@kubernetes-models/base": ^5.0.0 @@ -6868,6 +6869,7 @@ __metadata: "@backstage/plugin-catalog-react": "workspace:^" "@backstage/plugin-kubernetes-common": "workspace:^" "@backstage/plugin-kubernetes-react": "workspace:^" + "@backstage/plugin-permission-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@kubernetes-models/apimachinery": ^2.0.0 "@kubernetes-models/base": ^5.0.0