@backstage/plugin-kubernetes-react 0.3.0-next.0 → 0.3.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/hooks/useIsPodExecTerminalEnabled.ts","../src/api/types.ts","../src/hooks/useIsPodExecTerminalSupported.ts","../src/hooks/auth.ts","../src/kubernetes-auth-provider/types.ts","../src/kubernetes-auth-provider/GoogleKubernetesAuthProvider.ts","../src/kubernetes-auth-provider/ServerSideAuthProvider.ts","../src/kubernetes-auth-provider/OidcKubernetesAuthProvider.ts","../src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts","../src/kubernetes-auth-provider/KubernetesAuthProviders.ts","../src/hooks/useKubernetesObjects.ts","../src/hooks/useCustomResources.ts","../src/hooks/PodNamesWithErrors.ts","../src/hooks/PodNamesWithMetrics.ts","../src/hooks/GroupedResponses.ts","../src/hooks/Cluster.ts","../src/hooks/usePodMetrics.ts","../src/hooks/useMatchingErrors.ts","../src/api/KubernetesBackendClient.ts","../src/api/KubernetesClusterLinkFormatter.ts","../src/api/KubernetesProxyClient.ts","../src/api/formatters/AksClusterLinksFormatter.ts","../src/api/formatters/EksClusterLinksFormatter.ts","../src/api/formatters/GkeClusterLinksFormatter.ts","../src/api/formatters/StandardClusterLinksFormatter.ts","../src/api/formatters/OpenshiftClusterLinksFormatter.ts","../src/api/formatters/RancherClusterLinksFormatter.ts","../src/api/formatters/index.ts","../src/utils/resources.ts","../src/components/PodExecTerminal/PodExecTerminalAttachAddon.ts","../src/components/PodExecTerminal/PodExecTerminal.tsx","../src/components/PodExecTerminal/PodExecTerminalDialog.tsx","../src/components/ResourceUtilization/ResourceUtilization.tsx","../src/components/Pods/PodLogs/usePodLogs.ts","../src/components/Pods/PodLogs/PodLogs.tsx","../src/components/Pods/PodLogs/PodLogsDialog.tsx","../src/components/Pods/PodDrawer/ContainerCard.tsx","../src/components/KubernetesDrawer/ManifestYaml.tsx","../src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx","../src/components/KubernetesDrawer/KubernetesDrawer.tsx","../src/components/Pods/PodDrawer/PendingPodContent.tsx","../src/components/Pods/Events/useEvents.ts","../src/components/Pods/Events/Events.tsx","../src/components/Pods/FixDialog/FixDialog.tsx","../src/components/Pods/ErrorList/ErrorList.tsx","../src/components/Pods/PodDrawer/PodDrawer.tsx","../src/utils/pod.tsx","../src/components/Pods/PodsTable.tsx","../src/components/DeploymentsAccordions/DeploymentDrawer.tsx","../src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx","../src/utils/owner.ts","../src/components/DeploymentsAccordions/DeploymentsAccordions.tsx","../src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx","../src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx","../src/components/IngressesAccordions/IngressDrawer.tsx","../src/components/IngressesAccordions/IngressesAccordions.tsx","../src/components/ServicesAccordions/ServiceDrawer.tsx","../src/components/ServicesAccordions/ServicesAccordions.tsx","../src/components/JobsAccordions/JobsDrawer.tsx","../src/components/JobsAccordions/JobsAccordions.tsx","../src/components/CronJobsAccordions/CronJobsDrawer.tsx","../src/utils/crons.ts","../src/components/CronJobsAccordions/CronJobsAccordions.tsx","../src/components/CustomResources/ArgoRollouts/RolloutDrawer.tsx","../src/components/CustomResources/ArgoRollouts/StepsProgress.tsx","../src/components/CustomResources/ArgoRollouts/Rollout.tsx","../src/components/CustomResources/DefaultCustomResourceDrawer.tsx","../src/components/CustomResources/DefaultCustomResource.tsx","../src/components/CustomResources/CustomResources.tsx","../src/components/Cluster/Cluster.tsx","../src/components/ErrorPanel/ErrorPanel.tsx","../src/components/ErrorReporting/ErrorReporting.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\n\n/**\n * Check if conditions for a pod exec call through the proxy endpoint are met\n *\n * @internal\n */\nexport const useIsPodExecTerminalEnabled = (): boolean | undefined => {\n const configApi = useApi(configApiRef);\n\n return configApi.getOptionalBoolean('kubernetes.podExecTerminal.enabled');\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n KubernetesRequestBody,\n ObjectsByEntityResponse,\n WorkloadsByEntityRequest,\n CustomObjectsByEntityRequest,\n} from '@backstage/plugin-kubernetes-common';\nimport { createApiRef } from '@backstage/core-plugin-api';\nimport { Event } from 'kubernetes-models/v1';\nimport { JsonObject } from '@backstage/types';\n\n/** @public */\nexport const kubernetesApiRef = createApiRef<KubernetesApi>({\n id: 'plugin.kubernetes.service',\n});\n\n/** @public */\nexport const kubernetesProxyApiRef = createApiRef<KubernetesProxyApi>({\n id: 'plugin.kubernetes.proxy-service',\n});\n\n/** @public */\nexport const kubernetesClusterLinkFormatterApiRef =\n createApiRef<KubernetesClusterLinkFormatterApi>({\n id: 'plugin.kubernetes.cluster-link-formatter-service',\n });\n\n/** @public */\nexport interface KubernetesApi {\n getObjectsByEntity(\n requestBody: KubernetesRequestBody,\n ): Promise<ObjectsByEntityResponse>;\n getClusters(): Promise<\n {\n name: string;\n authProvider: string;\n oidcTokenProvider?: string;\n }[]\n >;\n getCluster(clusterName: string): Promise<\n | {\n name: string;\n authProvider: string;\n oidcTokenProvider?: string;\n dashboardUrl?: string;\n }\n | undefined\n >;\n getWorkloadsByEntity(\n request: WorkloadsByEntityRequest,\n ): Promise<ObjectsByEntityResponse>;\n getCustomObjectsByEntity(\n request: CustomObjectsByEntityRequest,\n ): Promise<ObjectsByEntityResponse>;\n proxy(options: {\n clusterName: string;\n path: string;\n init?: RequestInit;\n }): Promise<Response>;\n}\n\n/** @public */\nexport interface KubernetesProxyApi {\n getPodLogs(request: {\n podName: string;\n namespace: string;\n clusterName: string;\n containerName: string;\n previous?: boolean;\n }): Promise<{ text: string }>;\n getEventsByInvolvedObjectName(request: {\n clusterName: string;\n involvedObjectName: string;\n namespace: string;\n }): Promise<Event[]>;\n}\n\n/**\n * @public\n */\nexport type FormatClusterLinkOptions = {\n dashboardUrl?: string;\n dashboardApp?: string;\n dashboardParameters?: JsonObject;\n object: any;\n kind: string;\n};\n\n/** @public */\nexport interface KubernetesClusterLinkFormatterApi {\n formatClusterLink(\n options: FormatClusterLinkOptions,\n ): Promise<string | undefined>;\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync, { AsyncState } from 'react-use/lib/useAsync';\n\nimport { kubernetesApiRef } from '../api/types';\n\n/**\n * Check if conditions for a pod exec call through the proxy endpoint are met\n *\n * @internal\n */\nexport const useIsPodExecTerminalSupported = (): AsyncState<boolean> => {\n const kubernetesApi = useApi(kubernetesApiRef);\n\n return useAsync(async () => {\n const clusters = await kubernetesApi.getClusters();\n\n if (clusters.length !== 1) {\n return false;\n }\n\n const { authProvider } = clusters[0];\n const isClientAuthProvider = ['aks', 'google', 'oidc'].some(\n authProviderName => authProvider.includes(authProviderName),\n );\n\n return !isClientAuthProvider;\n });\n};\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { KubernetesAuthProvidersApi } from '../kubernetes-auth-provider';\nimport { KubernetesApi } from '../api/types';\n\nexport const generateAuth = async (\n entity: Entity,\n kubernetesApi: KubernetesApi,\n kubernetesAuthProvidersApi: KubernetesAuthProvidersApi,\n) => {\n const clusters = await kubernetesApi.getClusters();\n\n const authProviders: string[] = [\n ...new Set(\n clusters.map(\n c =>\n `${c.authProvider}${\n c.oidcTokenProvider ? `.${c.oidcTokenProvider}` : ''\n }`,\n ),\n ),\n ];\n\n let requestBody: KubernetesRequestBody = {\n entity,\n };\n for (const authProviderStr of authProviders) {\n requestBody = await kubernetesAuthProvidersApi.decorateRequestBodyForAuth(\n authProviderStr,\n requestBody,\n );\n }\n return requestBody.auth ?? {};\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { createApiRef } from '@backstage/core-plugin-api';\n\n/** @public */\nexport interface KubernetesAuthProvider {\n decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody>;\n getCredentials(): Promise<{ token?: string }>;\n}\n\n/** @public */\nexport const kubernetesAuthProvidersApiRef =\n createApiRef<KubernetesAuthProvidersApi>({\n id: 'plugin.kubernetes-auth-providers.service',\n });\n\n/** @public */\nexport interface KubernetesAuthProvidersApi {\n decorateRequestBodyForAuth(\n authProvider: string,\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody>;\n getCredentials(authProvider: string): Promise<{ token?: string }>;\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesAuthProvider } from './types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { OAuthApi } from '@backstage/core-plugin-api';\n\n/** @public */\nexport class GoogleKubernetesAuthProvider implements KubernetesAuthProvider {\n authProvider: OAuthApi;\n\n constructor(authProvider: OAuthApi) {\n this.authProvider = authProvider;\n }\n\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n const googleAuthToken: string = (await this.getCredentials()).token;\n if ('auth' in requestBody) {\n requestBody.auth!.google = googleAuthToken;\n } else {\n requestBody.auth = { google: googleAuthToken };\n }\n return requestBody;\n }\n async getCredentials(): Promise<{ token: string }> {\n return {\n token: await this.authProvider.getAccessToken(\n 'https://www.googleapis.com/auth/cloud-platform.read-only',\n ),\n };\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesAuthProvider } from './types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\n\n/**\n * No-op KubernetesAuthProvider, authorization will be handled in the kubernetes-backend plugin\n *\n * @public\n */\nexport class ServerSideKubernetesAuthProvider\n implements KubernetesAuthProvider\n{\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n // No-op, auth will be taken care of on the server-side\n return requestBody;\n }\n\n async getCredentials(): Promise<{}> {\n return {};\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { JsonObject } from '@backstage/types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { OpenIdConnectApi } from '@backstage/core-plugin-api';\nimport { KubernetesAuthProvider } from './types';\n\n/** @public */\nexport class OidcKubernetesAuthProvider implements KubernetesAuthProvider {\n providerName: string;\n authProvider: OpenIdConnectApi;\n\n constructor(providerName: string, authProvider: OpenIdConnectApi) {\n this.providerName = providerName;\n this.authProvider = authProvider;\n }\n\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n const authToken: string = (await this.getCredentials()).token;\n const auth = { ...(requestBody.auth as JsonObject) };\n if (auth.oidc) {\n (auth.oidc as JsonObject)[this.providerName] = authToken;\n } else {\n auth.oidc = { [this.providerName]: authToken };\n }\n requestBody.auth = auth;\n return requestBody;\n }\n\n async getCredentials(): Promise<{ token: string }> {\n return {\n token: await this.authProvider.getIdToken(),\n };\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { OAuthApi } from '@backstage/core-plugin-api';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { KubernetesAuthProvider } from './types';\n\n/** @public */\nexport class AksKubernetesAuthProvider implements KubernetesAuthProvider {\n constructor(private readonly microsoftAuthApi: OAuthApi) {}\n\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n return {\n ...requestBody,\n auth: { ...requestBody.auth, aks: (await this.getCredentials()).token },\n };\n }\n\n async getCredentials(): Promise<{ token?: string }> {\n return {\n token: await this.microsoftAuthApi.getAccessToken(\n '6dae42f8-4368-4678-94ff-3960e28e3630/user.read',\n ),\n };\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { KubernetesAuthProvider, KubernetesAuthProvidersApi } from './types';\nimport { GoogleKubernetesAuthProvider } from './GoogleKubernetesAuthProvider';\nimport { ServerSideKubernetesAuthProvider } from './ServerSideAuthProvider';\nimport { OAuthApi, OpenIdConnectApi } from '@backstage/core-plugin-api';\nimport { OidcKubernetesAuthProvider } from './OidcKubernetesAuthProvider';\nimport { AksKubernetesAuthProvider } from './AksKubernetesAuthProvider';\n\n/** @public */\nexport class KubernetesAuthProviders implements KubernetesAuthProvidersApi {\n private readonly kubernetesAuthProviderMap: Map<\n string,\n KubernetesAuthProvider\n >;\n\n constructor(options: {\n microsoftAuthApi: OAuthApi;\n googleAuthApi: OAuthApi;\n oidcProviders?: { [key: string]: OpenIdConnectApi };\n }) {\n this.kubernetesAuthProviderMap = new Map<string, KubernetesAuthProvider>();\n this.kubernetesAuthProviderMap.set(\n 'google',\n new GoogleKubernetesAuthProvider(options.googleAuthApi),\n );\n this.kubernetesAuthProviderMap.set(\n 'serviceAccount',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'googleServiceAccount',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'aws',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'azure',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'localKubectlProxy',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'aks',\n new AksKubernetesAuthProvider(options.microsoftAuthApi),\n );\n\n if (options.oidcProviders) {\n Object.keys(options.oidcProviders).forEach(provider => {\n this.kubernetesAuthProviderMap.set(\n `oidc.${provider}`,\n new OidcKubernetesAuthProvider(\n provider,\n options.oidcProviders![provider],\n ),\n );\n });\n }\n }\n\n async decorateRequestBodyForAuth(\n authProvider: string,\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n const kubernetesAuthProvider: KubernetesAuthProvider | undefined =\n this.kubernetesAuthProviderMap.get(authProvider);\n if (kubernetesAuthProvider) {\n return await kubernetesAuthProvider.decorateRequestBodyForAuth(\n requestBody,\n );\n }\n\n if (authProvider.startsWith('oidc.')) {\n throw new Error(\n `KubernetesAuthProviders has no oidcProvider configured for ${authProvider}`,\n );\n }\n throw new Error(\n `authProvider \"${authProvider}\" has no KubernetesAuthProvider defined for it`,\n );\n }\n\n async getCredentials(authProvider: string): Promise<{ token?: string }> {\n const kubernetesAuthProvider: KubernetesAuthProvider | undefined =\n this.kubernetesAuthProviderMap.get(authProvider);\n\n if (kubernetesAuthProvider) {\n return await kubernetesAuthProvider.getCredentials();\n }\n\n if (authProvider.startsWith('oidc.')) {\n throw new Error(\n `KubernetesAuthProviders has no oidcProvider configured for ${authProvider}`,\n );\n }\n throw new Error(\n `authProvider \"${authProvider}\" has no KubernetesAuthProvider defined for it`,\n );\n }\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { useCallback } from 'react';\nimport useInterval from 'react-use/lib/useInterval';\nimport { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { generateAuth } from './auth';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider';\nimport { kubernetesApiRef } from '../api/types';\n\n/**\n *\n * @public\n */\nexport interface KubernetesObjects {\n kubernetesObjects?: ObjectsByEntityResponse;\n loading: boolean;\n error?: string;\n}\n\n/**\n *\n * @public\n */\nexport const useKubernetesObjects = (\n entity: Entity,\n intervalMs: number = 10000,\n): KubernetesObjects => {\n const kubernetesApi = useApi(kubernetesApiRef);\n const kubernetesAuthProvidersApi = useApi(kubernetesAuthProvidersApiRef);\n const getObjects = useCallback(async (): Promise<ObjectsByEntityResponse> => {\n const auth = await generateAuth(\n entity,\n kubernetesApi,\n kubernetesAuthProvidersApi,\n );\n return await kubernetesApi.getObjectsByEntity({\n auth,\n entity,\n });\n }, [kubernetesApi, entity, kubernetesAuthProvidersApi]);\n\n const { value, loading, error, retry } = useAsyncRetry(\n () => getObjects(),\n [getObjects],\n );\n\n useInterval(() => retry(), intervalMs);\n\n return {\n kubernetesObjects: value,\n loading,\n error: error?.message,\n };\n};\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { useCallback } from 'react';\nimport useInterval from 'react-use/lib/useInterval';\nimport {\n CustomResourceMatcher,\n ObjectsByEntityResponse,\n} from '@backstage/plugin-kubernetes-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { KubernetesObjects } from './useKubernetesObjects';\nimport { generateAuth } from './auth';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider';\nimport { kubernetesApiRef } from '../api/types';\n\n/**\n * Retrieves the provided custom resources related to the provided entity, refreshes at an interval.\n *\n * @public\n */\nexport const useCustomResources = (\n entity: Entity,\n customResourceMatchers: CustomResourceMatcher[],\n intervalMs: number = 10000,\n): KubernetesObjects => {\n const kubernetesApi = useApi(kubernetesApiRef);\n const kubernetesAuthProvidersApi = useApi(kubernetesAuthProvidersApiRef);\n const matchersString = JSON.stringify(customResourceMatchers);\n const getCustomObjects = useCallback(\n async (): Promise<ObjectsByEntityResponse> => {\n const auth = await generateAuth(\n entity,\n kubernetesApi,\n kubernetesAuthProvidersApi,\n );\n return await kubernetesApi.getCustomObjectsByEntity({\n auth,\n customResources: customResourceMatchers,\n entity,\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [kubernetesApi, entity, kubernetesAuthProvidersApi, matchersString],\n );\n\n const { value, loading, error, retry } = useAsyncRetry(\n () => getCustomObjects(),\n [getCustomObjects],\n );\n\n useInterval(() => retry(), intervalMs);\n\n return {\n kubernetesObjects: value,\n loading,\n error: error?.message,\n };\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\n/**\n * @public\n */\nexport const PodNamesWithErrorsContext = React.createContext<Set<string>>(\n new Set<string>(),\n);\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { ClientPodStatus } from '@backstage/plugin-kubernetes-common';\n\n/**\n * @public\n */\nexport const PodNamesWithMetricsContext = React.createContext<\n Map<string, ClientPodStatus>\n>(new Map<string, ClientPodStatus>());\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { GroupedResponses } from '@backstage/plugin-kubernetes-common';\n\n/**\n *\n *\n * @public\n */\nexport const GroupedResponsesContext = React.createContext<GroupedResponses>({\n pods: [],\n replicaSets: [],\n deployments: [],\n services: [],\n configMaps: [],\n horizontalPodAutoscalers: [],\n ingresses: [],\n jobs: [],\n cronJobs: [],\n customResources: [],\n statefulsets: [],\n});\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\n\n/**\n * @public\n */\nexport const ClusterContext = React.createContext<ClusterAttributes>({\n name: '',\n});\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta';\nimport { ClientPodStatus } from '@backstage/plugin-kubernetes-common';\n\n/**\n * Context for Pod Metrics\n *\n * @public\n */\nexport const PodMetricsContext = React.createContext<\n Map<string, ClientPodStatus[]>\n>(new Map());\n\n/**\n * @public\n */\nexport type PodMetricsMatcher = {\n metadata?: IObjectMeta;\n};\n\n/**\n * Find metrics matching the provided pod\n *\n * @public\n */\nexport const usePodMetrics = (\n clusterName: string,\n matcher: PodMetricsMatcher,\n): ClientPodStatus | undefined => {\n const targetRef = {\n name: matcher.metadata?.name ?? '',\n namespace: matcher.metadata?.namespace ?? '',\n };\n\n const metricsMap = useContext(PodMetricsContext);\n\n const metrics = metricsMap.get(clusterName);\n\n return metrics?.find(m => {\n const pod = m.pod;\n return (\n targetRef.name === (pod.metadata?.name ?? '') &&\n targetRef.namespace === (pod.metadata?.namespace ?? '')\n );\n });\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport {\n DetectedError,\n ResourceRef,\n} from '@backstage/plugin-kubernetes-common';\nimport { TypeMeta } from '@kubernetes-models/base';\nimport { IIoK8sApimachineryPkgApisMetaV1ObjectMeta as V1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta';\n\n/**\n * Context for detected errors\n *\n * @public\n */\nexport const DetectedErrorsContext = React.createContext<DetectedError[]>([]);\n\n/**\n *\n * @public\n */\nexport type ErrorMatcher = {\n metadata?: V1ObjectMeta;\n} & TypeMeta;\n\n/**\n * Find errors which match the resource\n *\n * @public\n */\nexport const useMatchingErrors = (matcher: ErrorMatcher): DetectedError[] => {\n const targetRef: ResourceRef = {\n name: matcher.metadata?.name ?? '',\n namespace: matcher.metadata?.namespace ?? '',\n kind: matcher.kind,\n apiGroup: matcher.apiVersion,\n };\n\n const errors = useContext(DetectedErrorsContext);\n\n return errors.filter(e => {\n const r = e.sourceRef;\n return (\n targetRef.apiGroup === r.apiGroup &&\n targetRef.kind === r.kind &&\n targetRef.name === r.name &&\n targetRef.namespace === r.namespace\n );\n });\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesApi } from './types';\nimport {\n KubernetesRequestBody,\n ObjectsByEntityResponse,\n WorkloadsByEntityRequest,\n CustomObjectsByEntityRequest,\n} from '@backstage/plugin-kubernetes-common';\nimport { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { KubernetesAuthProvidersApi } from '../kubernetes-auth-provider';\nimport { NotFoundError } from '@backstage/errors';\n\n/** @public */\nexport class KubernetesBackendClient implements KubernetesApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly identityApi: IdentityApi;\n private readonly kubernetesAuthProvidersApi: KubernetesAuthProvidersApi;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n identityApi: IdentityApi;\n kubernetesAuthProvidersApi: KubernetesAuthProvidersApi;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.identityApi = options.identityApi;\n this.kubernetesAuthProvidersApi = options.kubernetesAuthProvidersApi;\n }\n\n private async handleResponse(response: Response): Promise<any> {\n if (!response.ok) {\n const payload = await response.text();\n let message;\n switch (response.status) {\n case 404:\n message =\n 'Could not find the Kubernetes Backend (HTTP 404). Make sure the plugin has been fully installed.';\n break;\n default:\n message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;\n }\n throw new Error(message);\n }\n\n return await response.json();\n }\n\n private async postRequired(path: string, requestBody: any): Promise<any> {\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}${path}`;\n const { token: idToken } = await this.identityApi.getCredentials();\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(requestBody),\n });\n\n return this.handleResponse(response);\n }\n\n public async getCluster(clusterName: string): Promise<{\n name: string;\n authProvider: string;\n oidcTokenProvider?: string;\n }> {\n const cluster = await this.getClusters().then(clusters =>\n clusters.find(c => c.name === clusterName),\n );\n if (!cluster) {\n throw new NotFoundError(`Cluster ${clusterName} not found`);\n }\n\n return cluster;\n }\n\n private async getCredentials(\n authProvider: string,\n oidcTokenProvider?: string,\n ): Promise<{ token?: string }> {\n return await this.kubernetesAuthProvidersApi.getCredentials(\n authProvider === 'oidc'\n ? `${authProvider}.${oidcTokenProvider}`\n : authProvider,\n );\n }\n\n async getObjectsByEntity(\n requestBody: KubernetesRequestBody,\n ): Promise<ObjectsByEntityResponse> {\n return await this.postRequired(\n `/services/${requestBody.entity.metadata.name}`,\n requestBody,\n );\n }\n\n async getWorkloadsByEntity(\n request: WorkloadsByEntityRequest,\n ): Promise<ObjectsByEntityResponse> {\n return await this.postRequired('/resources/workloads/query', {\n auth: request.auth,\n entityRef: stringifyEntityRef(request.entity),\n });\n }\n\n async getCustomObjectsByEntity(\n request: CustomObjectsByEntityRequest,\n ): Promise<ObjectsByEntityResponse> {\n return await this.postRequired(`/resources/custom/query`, {\n entityRef: stringifyEntityRef(request.entity),\n auth: request.auth,\n customResources: request.customResources,\n });\n }\n\n async getClusters(): Promise<{ name: string; authProvider: string }[]> {\n const { token: idToken } = await this.identityApi.getCredentials();\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}/clusters`;\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n });\n\n return (await this.handleResponse(response)).items;\n }\n\n async proxy(options: {\n clusterName: string;\n path: string;\n init?: RequestInit;\n }): Promise<Response> {\n const { authProvider, oidcTokenProvider } = await this.getCluster(\n options.clusterName,\n );\n const kubernetesCredentials = await this.getCredentials(\n authProvider,\n oidcTokenProvider,\n );\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}/proxy${\n options.path\n }`;\n const identityResponse = await this.identityApi.getCredentials();\n const headers = KubernetesBackendClient.getKubernetesHeaders(\n options,\n kubernetesCredentials?.token,\n identityResponse,\n authProvider,\n oidcTokenProvider,\n );\n return await fetch(url, { ...options.init, headers });\n }\n\n private static getKubernetesHeaders(\n options: {\n clusterName: string;\n path: string;\n init?: RequestInit;\n },\n k8sToken: string | undefined,\n identityResponse: { token?: string },\n authProvider: string,\n oidcTokenProvider: string | undefined,\n ) {\n const kubernetesAuthHeader =\n KubernetesBackendClient.getKubernetesAuthHeaderByAuthProvider(\n authProvider,\n oidcTokenProvider,\n );\n return {\n ...options.init?.headers,\n [`Backstage-Kubernetes-Cluster`]: options.clusterName,\n ...(k8sToken && {\n [kubernetesAuthHeader]: k8sToken,\n }),\n ...(identityResponse.token && {\n Authorization: `Bearer ${identityResponse.token}`,\n }),\n };\n }\n\n private static getKubernetesAuthHeaderByAuthProvider(\n authProvider: string,\n oidcTokenProvider: string | undefined,\n ): string {\n let header: string = 'Backstage-Kubernetes-Authorization';\n\n header = header.concat('-', authProvider);\n\n if (oidcTokenProvider) header = header.concat('-', oidcTokenProvider);\n\n return header;\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n KubernetesClusterLinkFormatterApi,\n FormatClusterLinkOptions,\n} from './types';\nimport { ClusterLinksFormatter } from '../types';\n\n/** @public */\nexport class KubernetesClusterLinkFormatter\n implements KubernetesClusterLinkFormatterApi\n{\n private readonly formatters: Record<string, ClusterLinksFormatter>;\n private readonly defaultFormatterName: string;\n\n constructor(options: {\n formatters: Record<string, ClusterLinksFormatter>;\n defaultFormatterName: string;\n }) {\n this.formatters = options.formatters;\n this.defaultFormatterName = options.defaultFormatterName;\n }\n async formatClusterLink(options: FormatClusterLinkOptions) {\n if (!options.dashboardUrl && !options.dashboardParameters) {\n return undefined;\n }\n if (options.dashboardUrl && !options.object) {\n return options.dashboardUrl;\n }\n const app = options.dashboardApp ?? this.defaultFormatterName;\n const formatter = this.formatters[app];\n if (!formatter) {\n throw new Error(`Could not find Kubernetes dashboard app named '${app}'`);\n }\n const url = await formatter.formatClusterLink({\n dashboardUrl: options.dashboardUrl\n ? new URL(options.dashboardUrl)\n : undefined,\n dashboardParameters: options.dashboardParameters,\n object: options.object,\n kind: options.kind,\n });\n return url.toString();\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { KubernetesApi } from './types';\nimport { Event } from 'kubernetes-models/v1';\n\n/**\n * A client for common requests through the proxy endpoint of the kubernetes backend plugin.\n *\n * @public\n */\nexport class KubernetesProxyClient {\n private readonly kubernetesApi: KubernetesApi;\n\n constructor(options: { kubernetesApi: KubernetesApi }) {\n this.kubernetesApi = options.kubernetesApi;\n }\n\n private async handleText(response: Response): Promise<string> {\n if (!response.ok) {\n const payload = await response.text();\n let message;\n switch (response.status) {\n default:\n message = `Proxy request failed with ${response.status} ${response.statusText}, ${payload}`;\n }\n throw new Error(message);\n }\n\n return await response.text();\n }\n\n private async handleJson(response: Response): Promise<any> {\n if (!response.ok) {\n const payload = await response.text();\n let message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;\n switch (response.status) {\n case 404:\n message = `Proxy request failed with ${response.status} ${response.statusText}, ${payload}`;\n break;\n default:\n message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;\n }\n throw new Error(message);\n }\n\n return await response.json();\n }\n\n async getEventsByInvolvedObjectName({\n clusterName,\n involvedObjectName,\n namespace,\n }: {\n clusterName: string;\n involvedObjectName: string;\n namespace: string;\n }): Promise<Event[]> {\n return await this.kubernetesApi\n .proxy({\n clusterName,\n path: `/api/v1/namespaces/${namespace}/events?fieldSelector=involvedObject.name=${involvedObjectName}`,\n init: {\n method: 'GET',\n },\n })\n .then(response => this.handleJson(response))\n .then(eventList => eventList.items);\n }\n\n async getPodLogs({\n podName,\n namespace,\n clusterName,\n containerName,\n previous,\n }: {\n podName: string;\n namespace: string;\n clusterName: string;\n containerName: string;\n previous?: boolean;\n }): Promise<{ text: string }> {\n const params = new URLSearchParams({\n container: containerName,\n });\n if (previous) {\n params.append('previous', '');\n }\n return await this.kubernetesApi\n .proxy({\n clusterName: clusterName,\n path: `/api/v1/namespaces/${namespace}/pods/${podName}/log?${params.toString()}`,\n init: {\n method: 'GET',\n },\n })\n .then(response => this.handleText(response))\n .then(text => ({ text }));\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ClusterLinksFormatter,\n ClusterLinksFormatterOptions,\n} from '../../types';\n\nconst basePath =\n 'https://portal.azure.com/#blade/Microsoft_Azure_ContainerService/AksK8ResourceMenuBlade/overview-Deployment/aksClusterId';\n\nconst requiredParams = ['subscriptionId', 'resourceGroup', 'clusterName'];\n\n/** @public */\nexport class AksClusterLinksFormatter implements ClusterLinksFormatter {\n async formatClusterLink(options: ClusterLinksFormatterOptions) {\n if (!options.dashboardParameters) {\n throw new Error('AKS dashboard requires a dashboardParameters option');\n }\n const args = options.dashboardParameters;\n for (const param of requiredParams) {\n if (typeof args[param] !== 'string') {\n throw new Error(\n `AKS dashboard requires a \"${param}\" of type string in the dashboardParameters option`,\n );\n }\n }\n\n const path = `/subscriptions/${args.subscriptionId}/resourceGroups/${args.resourceGroup}/providers/Microsoft.ContainerService/managedClusters/${args.clusterName}`;\n\n const { name, namespace, uid } = options.object.metadata;\n const { selector } = options.object.spec;\n const params = {\n kind: options.kind,\n metadata: { name, namespace, uid },\n spec: {\n selector,\n },\n };\n\n return new URL(\n `${basePath}/${encodeURIComponent(path)}/resource/${encodeURIComponent(\n JSON.stringify(params),\n )}`,\n );\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ClusterLinksFormatter,\n ClusterLinksFormatterOptions,\n} from '../../types';\n\n/** @public */\nexport class EksClusterLinksFormatter implements ClusterLinksFormatter {\n async formatClusterLink(\n _options: ClusterLinksFormatterOptions,\n ): Promise<URL> {\n throw new Error(\n 'EKS formatter is not yet implemented. Please, contribute!',\n );\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ClusterLinksFormatter,\n ClusterLinksFormatterOptions,\n} from '../../types';\nimport { ProfileInfoApi } from '@backstage/core-plugin-api';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployment',\n pod: 'pod',\n ingress: 'ingress',\n service: 'service',\n horizontalpodautoscaler: 'deployment',\n};\n\n/** @public */\nexport class GkeClusterLinksFormatter implements ClusterLinksFormatter {\n constructor(private readonly googleAuthApi: ProfileInfoApi | undefined) {}\n async formatClusterLink(options: ClusterLinksFormatterOptions): Promise<URL> {\n if (!options.dashboardParameters) {\n throw new Error('GKE dashboard requires a dashboardParameters option');\n }\n const args = options.dashboardParameters;\n if (typeof args.projectId !== 'string') {\n throw new Error(\n 'GKE dashboard requires a \"projectId\" of type string in the dashboardParameters option',\n );\n }\n if (typeof args.region !== 'string') {\n throw new Error(\n 'GKE dashboard requires a \"region\" of type string in the dashboardParameters option',\n );\n }\n if (typeof args.clusterName !== 'string') {\n throw new Error(\n 'GKE dashboard requires a \"clusterName\" of type string in the dashboardParameters option',\n );\n }\n const basePath = new URL('https://console.cloud.google.com/');\n const region = encodeURIComponent(args.region);\n const clusterName = encodeURIComponent(args.clusterName);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n let path: string;\n if (namespace && name && validKind) {\n const kindsWithDetails = ['ingress', 'pod'];\n const landingPage = kindsWithDetails.includes(validKind)\n ? 'details'\n : 'overview';\n path = `kubernetes/${validKind}/${region}/${clusterName}/${namespace}/${name}/${landingPage}`;\n } else {\n path = `kubernetes/clusters/details/${region}/${clusterName}/details`;\n }\n const result = new URL(path, basePath);\n result.searchParams.set('project', args.projectId);\n if (this.googleAuthApi) {\n const profile = await this.googleAuthApi.getProfile({ optional: true });\n if (profile?.email) {\n result.searchParams.set('authuser', profile.email);\n }\n }\n return result;\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ClusterLinksFormatter,\n ClusterLinksFormatterOptions,\n} from '../../types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployment',\n pod: 'pod',\n ingress: 'ingress',\n service: 'service',\n horizontalpodautoscaler: 'deployment',\n statefulset: 'statefulset',\n};\n\n/** @public */\nexport class StandardClusterLinksFormatter implements ClusterLinksFormatter {\n async formatClusterLink(options: ClusterLinksFormatterOptions): Promise<URL> {\n if (!options.dashboardUrl) {\n throw new Error('standard dashboard requires a dashboardUrl option');\n }\n const result = new URL(options.dashboardUrl.href);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n if (!result.pathname.endsWith('/')) {\n result.pathname += '/';\n }\n if (validKind && name && namespace) {\n result.hash = `/${validKind}/${namespace}/${name}`;\n } else if (namespace) {\n result.hash = '/workloads';\n }\n if (namespace) {\n // Note that Angular SPA requires a hash and the query parameter should be part of it\n result.hash += `?namespace=${namespace}`;\n }\n return result;\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployments',\n ingress: 'ingresses',\n service: 'services',\n horizontalpodautoscaler: 'horizontalpodautoscalers',\n persistentvolume: 'persistentvolumes',\n};\n\n/** @public */\nexport class OpenshiftClusterLinksFormatter {\n async formatClusterLink(options: ClusterLinksFormatterOptions): Promise<URL> {\n if (!options.dashboardUrl) {\n throw new Error('OpenShift dashboard requires a dashboardUrl option');\n }\n const basePath = new URL(options.dashboardUrl.href);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n if (!basePath.pathname.endsWith('/')) {\n // a dashboard url with a path should end with a slash otherwise\n // the new combined URL will replace the last segment with the appended path!\n // https://foobar.com/abc/def + k8s/cluster/projects/test --> https://foobar.com/abc/k8s/cluster/projects/test\n // https://foobar.com/abc/def/ + k8s/cluster/projects/test --> https://foobar.com/abc/def/k8s/cluster/projects/test\n basePath.pathname += '/';\n }\n let path = '';\n if (namespace) {\n if (name && validKind) {\n path = `k8s/ns/${namespace}/${validKind}/${name}`;\n } else {\n path = `k8s/cluster/projects/${namespace}`;\n }\n } else if (validKind) {\n path = `k8s/cluster/${validKind}`;\n if (name) {\n path += `/${name}`;\n }\n }\n return new URL(path, basePath);\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ClusterLinksFormatter,\n ClusterLinksFormatterOptions,\n} from '../../types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'apps.deployment',\n ingress: 'networking.k8s.io.ingress',\n service: 'service',\n horizontalpodautoscaler: 'autoscaling.horizontalpodautoscaler',\n};\n\n/** @public */\nexport class RancherClusterLinksFormatter implements ClusterLinksFormatter {\n async formatClusterLink(options: ClusterLinksFormatterOptions): Promise<URL> {\n if (!options.dashboardUrl) {\n throw new Error('Rancher dashboard requires a dashboardUrl option');\n }\n const basePath = new URL(options.dashboardUrl.href);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n if (!basePath.pathname.endsWith('/')) {\n // a dashboard url with a path should end with a slash otherwise\n // the new combined URL will replace the last segment with the appended path!\n // https://foobar.com/abc/def + explorer/service/test --> https://foobar.com/abc/explorer/service/test\n // https://foobar.com/abc/def/ + explorer/service/test --> https://foobar.com/abc/def/explorer/service/test\n basePath.pathname += '/';\n }\n let path = '';\n if (validKind && name && namespace) {\n path = `explorer/${validKind}/${namespace}/${name}`;\n } else if (namespace) {\n path = 'explorer/workload';\n }\n return new URL(path, basePath);\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AksClusterLinksFormatter } from './AksClusterLinksFormatter';\nimport { ClusterLinksFormatter } from '../../types';\nimport { EksClusterLinksFormatter } from './EksClusterLinksFormatter';\nimport { GkeClusterLinksFormatter } from './GkeClusterLinksFormatter';\nimport { StandardClusterLinksFormatter } from './StandardClusterLinksFormatter';\nimport { OpenshiftClusterLinksFormatter } from './OpenshiftClusterLinksFormatter';\nimport { RancherClusterLinksFormatter } from './RancherClusterLinksFormatter';\nimport { ProfileInfoApi } from '@backstage/core-plugin-api';\n\nexport {\n StandardClusterLinksFormatter,\n AksClusterLinksFormatter,\n EksClusterLinksFormatter,\n GkeClusterLinksFormatter,\n OpenshiftClusterLinksFormatter,\n RancherClusterLinksFormatter,\n};\n\n/** @public */\nexport const DEFAULT_FORMATTER_NAME = 'standard';\n\n/** @public */\nexport function getDefaultFormatters(deps: {\n googleAuthApi: ProfileInfoApi;\n}): Record<string, ClusterLinksFormatter> {\n return {\n standard: new StandardClusterLinksFormatter(),\n aks: new AksClusterLinksFormatter(),\n eks: new EksClusterLinksFormatter(),\n gke: new GkeClusterLinksFormatter(deps.googleAuthApi),\n openshift: new OpenshiftClusterLinksFormatter(),\n rancher: new RancherClusterLinksFormatter(),\n };\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport const currentToDeclaredResourceToPerc = (\n current: number | string,\n resource: number | string,\n): number => {\n if (Number(resource) === 0) return 0;\n\n if (typeof current === 'number' && typeof resource === 'number') {\n return Math.round((current / resource) * 100);\n }\n\n const numerator: bigint = BigInt(current);\n const denominator: bigint = BigInt(resource);\n\n return Number((numerator * BigInt(100)) / denominator);\n};\n\nexport const bytesToMiB = (value: string | number): string => {\n return `${(parseFloat(value.toString()) / 1024 / 1024).toFixed(0)}MiB`;\n};\n\nexport const formatMillicores = (value: string | number): string => {\n return `${(parseFloat(value.toString()) * 1000).toFixed(0)}m`;\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { AttachAddon, IAttachOptions } from 'xterm-addon-attach';\n\nexport class PodExecTerminalAttachAddon extends AttachAddon {\n #textEncoder = new TextEncoder();\n\n constructor(socket: WebSocket, options?: IAttachOptions) {\n super(socket, options);\n\n const thisAddon = this as any;\n\n // These methods are private in the original AttachAddon,\n // thus have to override at runtime like this\n thisAddon._sendBinary = (data: string) => {\n if (!thisAddon._checkOpenSocket()) {\n return;\n }\n\n const buffer = Uint8Array.from([0, ...this.#textEncoder.encode(data)]);\n\n thisAddon._socket.send(buffer);\n };\n\n thisAddon._sendData = (data: string) => {\n if (!thisAddon._checkOpenSocket()) {\n return;\n }\n\n thisAddon._sendBinary(data);\n };\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport 'xterm/css/xterm.css';\n\nimport { discoveryApiRef, useApi } from '@backstage/core-plugin-api';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { Terminal } from 'xterm';\nimport { FitAddon } from 'xterm-addon-fit';\n\nimport { PodExecTerminalAttachAddon } from './PodExecTerminalAttachAddon';\n\n/**\n * Props drilled down to the PodExecTerminal component\n *\n * @public\n */\nexport interface PodExecTerminalProps {\n clusterName: string;\n containerName: string;\n podName: string;\n podNamespace: string;\n}\n\nconst hasSocketProtocol = (url: string | URL) =>\n /wss?:\\/\\//.test(url.toString());\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n podExecTerminal: {\n width: '100%',\n height: '100%',\n '& .xterm-screen': { padding: theme.spacing(1) },\n },\n }),\n);\n\n/**\n * Executes a `/bin/sh` process in the given pod's container and opens a terminal connected to it\n *\n * @public\n */\nexport const PodExecTerminal = (props: PodExecTerminalProps) => {\n const classes = useStyles();\n const { containerName, podNamespace, podName } = props;\n\n const [baseUrl, setBaseUrl] = useState(window.location.host);\n\n const terminalRef = React.useRef(null);\n const discoveryApi = useApi(discoveryApiRef);\n const namespace = podNamespace ?? 'default';\n\n useEffect(() => {\n discoveryApi\n .getBaseUrl('kubernetes')\n .then(url => url ?? window.location.host)\n .then(url => url.replace(/^http(s?):\\/\\//, 'ws$1://'))\n .then(url => setBaseUrl(url));\n }, [discoveryApi]);\n\n const urlParams = useMemo(() => {\n const params = new URLSearchParams({\n container: containerName,\n stdin: 'true',\n stdout: 'true',\n stderr: 'true',\n tty: 'true',\n command: '/bin/sh',\n });\n return params;\n }, [containerName]);\n\n const socketUrl = useMemo(() => {\n if (!hasSocketProtocol(baseUrl)) {\n return '';\n }\n\n return new URL(\n `${baseUrl}/proxy/api/v1/namespaces/${namespace}/pods/${podName}/exec?${urlParams}`,\n );\n }, [baseUrl, namespace, podName, urlParams]);\n\n useEffect(() => {\n if (!hasSocketProtocol(socketUrl)) {\n return () => {};\n }\n\n const terminal = new Terminal();\n const fitAddon = new FitAddon();\n terminal.loadAddon(fitAddon);\n\n if (terminalRef.current) {\n terminal.open(terminalRef.current);\n fitAddon.fit();\n }\n\n terminal.writeln('Starting terminal, please wait...');\n\n const socket = new WebSocket(socketUrl, ['channel.k8s.io']);\n\n socket.onopen = () => {\n terminal.clear();\n const attachAddon = new PodExecTerminalAttachAddon(socket, {\n bidirectional: true,\n });\n\n terminal.loadAddon(attachAddon);\n };\n\n socket.onclose = () => {\n terminal.writeln('Socket connection closed');\n };\n\n return () => {\n terminal?.clear();\n socket?.close();\n };\n }, [baseUrl, socketUrl]);\n\n return (\n <div\n data-testid=\"terminal\"\n ref={terminalRef}\n className={classes.podExecTerminal}\n />\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Button,\n createStyles,\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n makeStyles,\n Theme,\n} from '@material-ui/core';\nimport CloseIcon from '@material-ui/icons/Close';\nimport OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';\nimport React, { useState } from 'react';\n\nimport { useIsPodExecTerminalSupported } from '../../hooks';\nimport { PodExecTerminal, PodExecTerminalProps } from './PodExecTerminal';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n dialogPaper: { minHeight: 'calc(100% - 64px)' },\n dialogContent: { flexBasis: 0 },\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\n/**\n * Opens a terminal connected to the given pod's container in a dialog\n *\n * @public\n */\nexport const PodExecTerminalDialog = (props: PodExecTerminalProps) => {\n const classes = useStyles();\n const { clusterName, containerName, podName } = props;\n\n const [open, setOpen] = useState(false);\n\n const isPodExecTerminalSupported = useIsPodExecTerminalSupported();\n\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n\n return (\n <>\n {!isPodExecTerminalSupported.loading &&\n isPodExecTerminalSupported.value && (\n <Dialog\n maxWidth={false}\n fullWidth\n open={open}\n onClose={closeDialog}\n PaperProps={{ className: classes.dialogPaper }}\n >\n <DialogTitle id=\"dialog-title\">\n {podName} - {containerName} terminal shell on cluster{' '}\n {clusterName}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent className={classes.dialogContent}>\n <PodExecTerminal {...props} />\n </DialogContent>\n </Dialog>\n )}\n\n <Button\n variant=\"outlined\"\n aria-label=\"open terminal\"\n component=\"label\"\n disabled={\n isPodExecTerminalSupported.loading ||\n !isPodExecTerminalSupported.value\n }\n onClick={openDialog}\n startIcon={<OpenInBrowserIcon />}\n >\n Terminal\n </Button>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Grid, Typography } from '@material-ui/core';\n\nimport React from 'react';\nimport { GaugePropsGetColor, LinearGauge } from '@backstage/core-components';\nimport { currentToDeclaredResourceToPerc } from '../../utils/resources';\n\n/**\n * Context for Pod Metrics\n *\n * @public\n */\nexport interface ResourceUtilizationProps {\n compressed?: boolean;\n title: string;\n usage: number | string;\n total: number | string;\n totalFormatted: string;\n}\n\nconst getProgressColor: GaugePropsGetColor = ({\n palette,\n value,\n inverse,\n max,\n}) => {\n if (isNaN(value)) {\n return palette.status.pending;\n }\n const actualMax = max ? max : 100;\n const actualValue = inverse ? actualMax - value : value;\n\n if (actualValue >= actualMax) {\n return palette.status.error;\n } else if (actualValue > 90 || actualValue < 40) {\n return palette.status.warning;\n }\n\n return palette.status.ok;\n};\n\n/**\n * Context for Pod Metrics\n *\n * @public\n */\nexport const ResourceUtilization = ({\n compressed = false,\n title,\n usage,\n total,\n totalFormatted,\n}: ResourceUtilizationProps) => {\n const utilization = currentToDeclaredResourceToPerc(usage, total);\n return (\n <Grid container spacing={0}>\n <Grid item xs={12}>\n <Typography\n variant={compressed ? 'caption' : 'subtitle2'}\n >{`${title}: ${totalFormatted}`}</Typography>\n </Grid>\n <Grid item xs={12}>\n <LinearGauge\n getColor={getProgressColor}\n width={compressed ? 'thin' : 'thick'}\n value={utilization / 100}\n />\n {!compressed && (\n <Typography variant=\"caption\">usage: {`${utilization}%`}</Typography>\n )}\n </Grid>\n </Grid>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport useAsync from 'react-use/lib/useAsync';\n\nimport { ContainerScope } from './types';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { kubernetesProxyApiRef } from '../../../api/types';\n\n/**\n * Arguments for usePodLogs\n *\n * @public\n */\nexport interface PodLogsOptions {\n containerScope: ContainerScope;\n previous?: boolean;\n}\n\n/**\n * Retrieves the logs for the given pod\n *\n * @public\n */\nexport const usePodLogs = ({ containerScope, previous }: PodLogsOptions) => {\n const kubernetesProxyApi = useApi(kubernetesProxyApiRef);\n return useAsync(async () => {\n return await kubernetesProxyApi.getPodLogs({\n podName: containerScope.podName,\n namespace: containerScope.podNamespace,\n containerName: containerScope.containerName,\n clusterName: containerScope.clusterName,\n previous,\n });\n }, [JSON.stringify(containerScope)]);\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n DismissableBanner,\n EmptyState,\n LogViewer,\n} from '@backstage/core-components';\nimport { Paper } from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\n\nimport { ContainerScope } from './types';\nimport { usePodLogs } from './usePodLogs';\n\n/**\n * Props for PodLogs\n *\n * @public\n */\nexport interface PodLogsProps {\n containerScope: ContainerScope;\n previous?: boolean;\n}\n\n/**\n * Shows the logs for the given pod\n *\n * @public\n */\nexport const PodLogs: React.FC<PodLogsProps> = ({\n containerScope,\n previous,\n}: PodLogsProps) => {\n const { value, error, loading } = usePodLogs({\n containerScope,\n previous,\n });\n\n return (\n <>\n {error && (\n <DismissableBanner\n {...{\n message: error.message,\n variant: 'error',\n fixed: false,\n }}\n id=\"pod-logs\"\n />\n )}\n <Paper\n elevation={1}\n style={{ height: '100%', width: '100%', minHeight: '55rem' }}\n >\n {loading && <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />}\n {!loading &&\n value !== undefined &&\n (value.text === '' ? (\n <EmptyState\n missing=\"data\"\n title=\"No logs emitted\"\n description=\"No logs were emitted by the container\"\n />\n ) : (\n <LogViewer text={value.text} />\n ))}\n </Paper>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState } from 'react';\n\nimport {\n Button,\n createStyles,\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n makeStyles,\n Theme,\n} from '@material-ui/core';\nimport SubjectIcon from '@material-ui/icons/Subject';\n\nimport CloseIcon from '@material-ui/icons/Close';\n\nimport { PodLogs } from './PodLogs';\nimport { ContainerScope } from './types';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\n/**\n * Props for PodLogsDialog\n *\n * @public\n */\nexport interface PodLogsDialogProps {\n containerScope: ContainerScope;\n}\n\n/**\n * Shows the logs for the given pod in a Dialog\n *\n * @public\n */\nexport const PodLogsDialog = ({ containerScope }: PodLogsDialogProps) => {\n const classes = useStyles();\n const [open, setOpen] = useState(false);\n\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n return (\n <>\n <Dialog maxWidth=\"xl\" fullWidth open={open} onClose={closeDialog}>\n <DialogTitle id=\"dialog-title\">\n {containerScope.podName} - {containerScope.containerName} logs on\n cluster {containerScope.clusterName}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <PodLogs containerScope={containerScope} />\n </DialogContent>\n </Dialog>\n <Button\n variant=\"outlined\"\n aria-label=\"get logs\"\n component=\"label\"\n onClick={openDialog}\n startIcon={<SubjectIcon />}\n >\n Logs\n </Button>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { StructuredMetadataTable } from '@backstage/core-components';\nimport { ClientContainerStatus } from '@backstage/plugin-kubernetes-common';\nimport {\n Card,\n CardActions,\n CardContent,\n CardHeader,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport { IContainer, IContainerStatus } from 'kubernetes-models/v1';\nimport { DateTime } from 'luxon';\nimport React from 'react';\n\nimport { useIsPodExecTerminalEnabled } from '../../../hooks';\nimport { bytesToMiB, formatMillicores } from '../../../utils/resources';\nimport { PodExecTerminalDialog } from '../../PodExecTerminal/PodExecTerminalDialog';\nimport { ResourceUtilization } from '../../ResourceUtilization';\nimport { PodLogsDialog, PodScope } from '../PodLogs';\n\nconst getContainerHealthChecks = (\n containerSpec: IContainer,\n containerStatus: IContainerStatus,\n): { [key: string]: boolean } => {\n if (containerStatus.state?.terminated?.reason === 'Completed') {\n return {\n 'not waiting to start': containerStatus.state?.waiting === undefined,\n 'no restarts': containerStatus.restartCount === 0,\n };\n }\n return {\n 'not waiting to start': containerStatus.state?.waiting === undefined,\n started: !!containerStatus.started,\n ready: containerStatus.ready,\n 'no restarts': containerStatus.restartCount === 0,\n 'readiness probe set':\n containerSpec && containerSpec?.readinessProbe !== undefined,\n };\n};\n\nconst getCurrentState = (containerStatus: IContainerStatus): string => {\n return (\n containerStatus.state?.waiting?.reason ||\n containerStatus.state?.terminated?.reason ||\n (containerStatus.state?.running !== undefined ? 'Running' : 'Unknown')\n );\n};\n\nconst getStartedAtTime = (\n containerStatus: IContainerStatus,\n): string | undefined => {\n return (\n containerStatus.state?.running?.startedAt ||\n containerStatus.state?.terminated?.startedAt\n );\n};\n\ninterface ContainerDatetimeProps {\n prefix: string;\n dateTime: string;\n}\n\nconst ContainerDatetime = ({ prefix, dateTime }: ContainerDatetimeProps) => {\n return (\n <Typography variant=\"subtitle2\">\n {prefix}:{' '}\n {DateTime.fromISO(dateTime).toRelative({\n locale: 'en',\n })}\n </Typography>\n );\n};\n\n/**\n * Props for ContainerCard\n *\n * @public\n */\nexport interface ContainerCardProps {\n podScope: PodScope;\n containerSpec?: IContainer;\n containerStatus: IContainerStatus;\n containerMetrics?: ClientContainerStatus;\n}\n\n/**\n * Shows details about a container within a pod\n *\n * @public\n */\nexport const ContainerCard: React.FC<ContainerCardProps> = ({\n podScope,\n containerSpec,\n containerStatus,\n containerMetrics,\n}: ContainerCardProps) => {\n const isPodExecTerminalEnabled = useIsPodExecTerminalEnabled();\n\n // This should never be undefined\n if (containerSpec === undefined) {\n return <Typography>error reading pod from cluster</Typography>;\n }\n const containerStartedTime = getStartedAtTime(containerStatus);\n const containerFinishedTime = containerStatus.state?.terminated?.finishedAt;\n\n return (\n <Card>\n <CardHeader\n title={containerStatus.name}\n subheader={containerStatus.image}\n />\n <CardContent>\n <Grid container>\n <Grid item xs={12}>\n {containerStartedTime && (\n <ContainerDatetime\n prefix=\"Started\"\n dateTime={containerStartedTime}\n />\n )}\n {containerFinishedTime && (\n <ContainerDatetime\n prefix=\"Completed\"\n dateTime={containerFinishedTime}\n />\n )}\n {containerStartedTime && containerFinishedTime && (\n <Typography variant=\"subtitle2\">\n Execution time:{' '}\n {DateTime.fromISO(containerFinishedTime)\n .diff(DateTime.fromISO(containerStartedTime), [\n 'hours',\n 'minutes',\n 'seconds',\n ])\n .toHuman()}\n </Typography>\n )}\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n Status: {getCurrentState(containerStatus)}\n </Typography>\n </Grid>\n {containerStatus.restartCount > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n Restarts: {containerStatus.restartCount}\n </Typography>\n </Grid>\n )}\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Container health</Typography>\n </Grid>\n <Grid item xs={12}>\n <StructuredMetadataTable\n metadata={getContainerHealthChecks(\n containerSpec,\n containerStatus,\n )}\n />\n </Grid>\n {containerMetrics && (\n <Grid container item xs={12} spacing={0}>\n <Grid item xs={12}>\n <Typography variant=\"subtitle1\">\n Resource utilization\n </Typography>\n </Grid>\n <Grid item xs={12} style={{ minHeight: '5rem' }}>\n <ResourceUtilization\n compressed\n title=\"CPU requests\"\n usage={containerMetrics.cpuUsage.currentUsage}\n total={containerMetrics.cpuUsage.requestTotal}\n totalFormatted={formatMillicores(\n containerMetrics.cpuUsage.requestTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"CPU limits\"\n usage={containerMetrics.cpuUsage.currentUsage}\n total={containerMetrics.cpuUsage.limitTotal}\n totalFormatted={formatMillicores(\n containerMetrics.cpuUsage.limitTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"Memory requests\"\n usage={containerMetrics.memoryUsage.currentUsage}\n total={containerMetrics.memoryUsage.requestTotal}\n totalFormatted={bytesToMiB(\n containerMetrics.memoryUsage.requestTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"Memory limits\"\n usage={containerMetrics.memoryUsage.currentUsage}\n total={containerMetrics.memoryUsage.limitTotal}\n totalFormatted={bytesToMiB(\n containerMetrics.memoryUsage.limitTotal,\n )}\n />\n </Grid>\n </Grid>\n )}\n </Grid>\n </CardContent>\n <CardActions>\n <PodLogsDialog\n containerScope={{\n containerName: containerStatus.name,\n ...podScope,\n }}\n />\n {isPodExecTerminalEnabled && (\n <PodExecTerminalDialog\n clusterName={podScope.clusterName}\n containerName={containerStatus.name}\n podName={podScope.podName}\n podNamespace={podScope.podNamespace}\n />\n )}\n </CardActions>\n </Card>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { CodeSnippet } from '@backstage/core-components';\nimport { FormControlLabel, Switch } from '@material-ui/core';\nimport jsyaml from 'js-yaml';\nimport React, { useState } from 'react';\n\n/**\n * Props of ManifestYaml\n *\n * @public\n */\nexport interface ManifestYamlProps {\n object: object;\n}\n\n/**\n * Renders a Kubernetes object as a YAML code snippet\n *\n * @public\n */\nexport const ManifestYaml = ({ object }: ManifestYamlProps) => {\n // Toggle whether the Kubernetes resource managed fields should be shown in\n // the YAML display. This toggle is only available when the YAML is being\n // shown because managed fields are never visible in the structured display.\n const [managedFields, setManagedFields] = useState<boolean>(false);\n return (\n <>\n <FormControlLabel\n control={\n <Switch\n checked={managedFields}\n onChange={event => {\n setManagedFields(event.target.checked);\n }}\n name=\"Managed Fields\"\n />\n }\n label=\"Managed Fields\"\n />\n <CodeSnippet\n language=\"yaml\"\n text={jsyaml.dump(object, {\n // NOTE: this will remove any field called `managedFields`\n // not just the metadata one\n // TODO: @mclarke make this only remove the `metadata.managedFields`\n replacer: (key: string, value: string): any => {\n if (!managedFields) {\n return key === 'managedFields' ? undefined : value;\n }\n return value;\n },\n })}\n />\n </>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { ChangeEvent, useContext, useState } from 'react';\nimport {\n Button,\n Typography,\n makeStyles,\n IconButton,\n createStyles,\n Theme,\n Drawer,\n Switch,\n FormControlLabel,\n Grid,\n} from '@material-ui/core';\nimport Close from '@material-ui/icons/Close';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\nimport { V1ObjectMeta } from '@kubernetes/client-node';\nimport { withStyles } from '@material-ui/core/styles';\nimport {\n LinkButton as BackstageButton,\n StructuredMetadataTable,\n WarningPanel,\n} from '@backstage/core-components';\nimport { ClusterContext } from '../../hooks';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\nimport { ManifestYaml } from './ManifestYaml';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { kubernetesClusterLinkFormatterApiRef } from '../../api';\nimport useAsync from 'react-use/lib/useAsync';\n\nconst useDrawerStyles = makeStyles((theme: Theme) =>\n createStyles({\n paper: {\n width: '50%',\n justifyContent: 'space-between',\n padding: theme.spacing(2.5),\n },\n }),\n);\n\nconst useDrawerContentStyles = makeStyles((_: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n errorMessage: {\n marginTop: '1em',\n marginBottom: '1em',\n },\n options: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n icon: {\n fontSize: 20,\n },\n content: {\n height: '80%',\n },\n }),\n);\n\nconst PodDrawerButton = withStyles({\n root: {\n padding: '6px 5px',\n },\n label: {\n textTransform: 'none',\n },\n})(Button);\n\n/**\n *\n *\n * @public\n */\nexport type LinkErrorPanelProps = {\n cluster: ClusterAttributes;\n errorMessage?: string;\n children?: React.ReactNode;\n};\n\n/**\n *\n *\n * @public\n */\nexport const LinkErrorPanel = ({\n cluster,\n errorMessage,\n}: LinkErrorPanelProps) => (\n <WarningPanel\n title=\"There was a problem formatting the link to the Kubernetes dashboard\"\n message={`Could not format the link to the dashboard of your cluster named '${\n cluster.name\n }'. Its dashboardApp property has been set to '${\n cluster.dashboardApp || 'standard'\n }.'`}\n >\n {errorMessage && (\n <Typography variant=\"body2\">Errors: {errorMessage}</Typography>\n )}\n </WarningPanel>\n);\n\n/**\n *\n *\n * @public\n */\nexport interface KubernetesDrawerable {\n metadata?: V1ObjectMeta;\n}\n\ninterface KubernetesStructuredMetadataTableDrawerContentProps<\n T extends KubernetesDrawerable,\n> {\n toggleDrawer: (e: ChangeEvent<{}>, isOpen: boolean) => void;\n object: T;\n renderObject: (obj: T) => object;\n kind: string;\n}\n\nfunction replaceNullsWithUndefined(someObj: any) {\n const replacer = (_: any, value: any) =>\n String(value) === 'null' || String(value) === 'undefined'\n ? undefined\n : value;\n\n return JSON.parse(JSON.stringify(someObj, replacer));\n}\n\nconst KubernetesStructuredMetadataTableDrawerContent = <\n T extends KubernetesDrawerable,\n>({\n toggleDrawer,\n object,\n renderObject,\n kind,\n}: KubernetesStructuredMetadataTableDrawerContentProps<T>) => {\n const [isYaml, setIsYaml] = useState<boolean>(false);\n\n const formatter = useApi(kubernetesClusterLinkFormatterApiRef);\n const classes = useDrawerContentStyles();\n const cluster = useContext(ClusterContext);\n const { value: clusterLink, error } = useAsync(\n async () =>\n formatter.formatClusterLink({\n dashboardUrl: cluster.dashboardUrl,\n dashboardApp: cluster.dashboardApp,\n dashboardParameters: cluster.dashboardParameters,\n object,\n kind,\n }),\n [cluster, object, kind, formatter],\n );\n\n return (\n <>\n <div className={classes.header}>\n <Grid container justifyContent=\"flex-start\" alignItems=\"flex-start\">\n <Grid item xs={11}>\n <Typography variant=\"h5\">\n {object.metadata?.name ?? 'unknown name'}\n </Typography>\n </Grid>\n <Grid item xs={1}>\n <IconButton\n key=\"dismiss\"\n title=\"Close the drawer\"\n onClick={e => toggleDrawer(e, false)}\n color=\"inherit\"\n >\n <Close className={classes.icon} />\n </IconButton>\n </Grid>\n <Grid item xs={11}>\n <Typography color=\"textSecondary\" variant=\"body1\">\n {kind}\n </Typography>\n </Grid>\n <Grid item xs={11}>\n <FormControlLabel\n control={\n <Switch\n checked={isYaml}\n onChange={event => {\n setIsYaml(event.target.checked);\n }}\n name=\"YAML\"\n />\n }\n label=\"YAML\"\n />\n </Grid>\n </Grid>\n </div>\n {error && (\n <div className={classes.errorMessage}>\n <LinkErrorPanel\n cluster={cluster}\n errorMessage={error.message || error.toString()}\n />\n </div>\n )}\n <div className={classes.options}>\n <div>\n {clusterLink && (\n <BackstageButton\n variant=\"outlined\"\n color=\"primary\"\n size=\"small\"\n to={clusterLink}\n endIcon={<OpenInNewIcon />}\n >\n Open Kubernetes Dashboard\n </BackstageButton>\n )}\n </div>\n </div>\n <div className={classes.content}>\n {isYaml && <ManifestYaml object={object} />}\n {!isYaml && (\n <StructuredMetadataTable\n metadata={renderObject(replaceNullsWithUndefined(object))}\n />\n )}\n </div>\n </>\n );\n};\n\n/**\n *\n * @public\n */\nexport interface KubernetesStructuredMetadataTableDrawerProps<\n T extends KubernetesDrawerable,\n> {\n object: T;\n renderObject: (obj: T) => object;\n buttonVariant?: 'h5' | 'subtitle2';\n kind: string;\n expanded?: boolean;\n children?: React.ReactNode;\n}\n\n/**\n *\n * @public\n */\nexport const KubernetesStructuredMetadataTableDrawer = <\n T extends KubernetesDrawerable,\n>({\n object,\n renderObject,\n kind,\n buttonVariant = 'subtitle2',\n expanded = false,\n children,\n}: KubernetesStructuredMetadataTableDrawerProps<T>) => {\n const [isOpen, setIsOpen] = useState(expanded);\n const classes = useDrawerStyles();\n\n const toggleDrawer = (e: ChangeEvent<{}>, newValue: boolean) => {\n e.stopPropagation();\n setIsOpen(newValue);\n };\n\n return (\n <>\n <PodDrawerButton\n onClick={e => toggleDrawer(e, true)}\n onFocus={event => event.stopPropagation()}\n >\n {children === undefined ? (\n <Typography variant={buttonVariant}>\n {object.metadata?.name ?? 'unknown object'}\n </Typography>\n ) : (\n children\n )}\n </PodDrawerButton>\n <Drawer\n classes={{\n paper: classes.paper,\n }}\n anchor=\"right\"\n open={isOpen}\n onClose={(e: any) => toggleDrawer(e, false)}\n onClick={event => event.stopPropagation()}\n >\n <KubernetesStructuredMetadataTableDrawerContent\n kind={kind}\n toggleDrawer={toggleDrawer}\n object={object}\n renderObject={renderObject}\n />\n </Drawer>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { ChangeEvent, useState } from 'react';\n\nimport { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta';\nimport {\n createStyles,\n Drawer,\n makeStyles,\n Theme,\n Grid,\n IconButton,\n Switch,\n Typography,\n Button,\n withStyles,\n FormControlLabel,\n} from '@material-ui/core';\nimport CloseIcon from '@material-ui/icons/Close';\nimport { ManifestYaml } from './ManifestYaml';\n\nconst useDrawerContentStyles = makeStyles((_theme: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n content: {\n height: '80%',\n },\n icon: {\n fontSize: 20,\n },\n }),\n);\n\n/**\n * The type of object that can be represented by the Drawer\n *\n * @public\n */\nexport interface KubernetesObject {\n kind: string;\n metadata?: IObjectMeta;\n}\n\ninterface KubernetesDrawerContentProps {\n close: () => void;\n kubernetesObject: KubernetesObject;\n header?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nconst KubernetesDrawerContent = ({\n children,\n header,\n kubernetesObject,\n close,\n}: KubernetesDrawerContentProps) => {\n const classes = useDrawerContentStyles();\n const [isYaml, setIsYaml] = useState<boolean>(false);\n\n return (\n <>\n <div className={classes.header}>\n <Grid container justifyContent=\"flex-start\" alignItems=\"flex-start\">\n <Grid item xs={11}>\n <Typography variant=\"h5\">\n {kubernetesObject.metadata?.name}\n </Typography>\n </Grid>\n <Grid item xs={1}>\n <IconButton\n key=\"dismiss\"\n title=\"Close the drawer\"\n onClick={() => close()}\n color=\"inherit\"\n >\n <CloseIcon className={classes.icon} />\n </IconButton>\n </Grid>\n <Grid item xs={12}>\n {header}\n </Grid>\n <Grid item xs={12}>\n <FormControlLabel\n control={\n <Switch\n checked={isYaml}\n onChange={event => {\n setIsYaml(event.target.checked);\n }}\n name=\"YAML\"\n />\n }\n label=\"YAML\"\n />\n </Grid>\n </Grid>\n </div>\n <div className={classes.content}>\n {isYaml && <ManifestYaml object={kubernetesObject} />}\n {!isYaml && children}\n </div>\n </>\n );\n};\n\n/**\n * Props of KubernetesDrawer\n *\n * @public\n */\nexport interface KubernetesDrawerProps {\n open?: boolean;\n kubernetesObject: KubernetesObject;\n label: React.ReactNode;\n drawerContentsHeader?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nconst useDrawerStyles = makeStyles((theme: Theme) =>\n createStyles({\n paper: {\n width: '50%',\n justifyContent: 'space-between',\n padding: theme.spacing(2.5),\n },\n }),\n);\n\nconst DrawerButton = withStyles({\n root: {\n padding: '6px 5px',\n },\n label: {\n textTransform: 'none',\n },\n})(Button);\n\n/**\n * Button/Drawer component for Kubernetes Objects\n *\n * @public\n */\nexport const KubernetesDrawer = ({\n open,\n label,\n drawerContentsHeader,\n kubernetesObject,\n children,\n}: KubernetesDrawerProps) => {\n const classes = useDrawerStyles();\n const [isOpen, setIsOpen] = useState<boolean>(open ?? false);\n\n const toggleDrawer = (e: ChangeEvent<{}>, newValue: boolean) => {\n e.stopPropagation();\n setIsOpen(newValue);\n };\n\n return (\n <>\n <DrawerButton onClick={() => setIsOpen(true)}>{label}</DrawerButton>\n <Drawer\n classes={{\n paper: classes.paper,\n }}\n anchor=\"right\"\n open={isOpen}\n onClose={(e: any) => toggleDrawer(e, false)}\n onClick={event => event.stopPropagation()}\n >\n {isOpen && (\n <KubernetesDrawerContent\n header={drawerContentsHeader}\n kubernetesObject={kubernetesObject}\n children={children}\n close={() => setIsOpen(false)}\n />\n )}\n </Drawer>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { Grid, List, ListItem, Typography } from '@material-ui/core';\nimport { IPodCondition, Pod } from 'kubernetes-models/v1';\nimport {\n StatusError,\n StatusOK,\n StatusWarning,\n} from '@backstage/core-components';\nimport { DateTime } from 'luxon';\n\ninterface PodConditionProps {\n condition: IPodCondition;\n}\n\nconst PodCondition = ({ condition }: PodConditionProps) => {\n return (\n <>\n {condition.status === 'False' && (\n <StatusError>\n {condition.type} - ({condition.reason}{' '}\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n ) - {condition.message}{' '}\n </StatusError>\n )}\n {condition.status === 'True' && (\n <StatusOK>\n {condition.type} - (\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n )\n </StatusOK>\n )}\n {condition.status === 'Unknown' && (\n <StatusWarning>\n {condition.type} - (\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n ) {condition.message}\n </StatusWarning>\n )}\n </>\n );\n};\n\n/**\n * Props for PendingPodContent\n *\n * @public\n */\nexport interface PendingPodContentProps {\n pod: Pod;\n}\n\n/**\n * Shows details about pod's conditions as it starts\n *\n * @public\n */\nexport const PendingPodContent = ({ pod }: PendingPodContentProps) => {\n // TODO add PodHasNetwork when it's out of alpha\n // https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-conditions\n const startupConditions = [\n pod.status?.conditions?.find(c => c.type === 'PodScheduled'),\n pod.status?.conditions?.find(c => c.type === 'Initialized'),\n pod.status?.conditions?.find(c => c.type === 'ContainersReady'),\n pod.status?.conditions?.find(c => c.type === 'Ready'),\n ].filter((c): c is IPodCondition => !!c); // filter out undefined\n return (\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Pod is Pending. Conditions:</Typography>\n <List>\n {startupConditions.map(c => (\n <ListItem key={c.type}>\n <PodCondition condition={c} />\n </ListItem>\n ))}\n </List>\n </Grid>\n </Grid>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/lib/useAsync';\nimport { kubernetesProxyApiRef } from '../../../api/types';\n\n/**\n * Arguments for useEvents\n *\n * @public\n */\nexport interface EventsOptions {\n involvedObjectName: string;\n namespace: string;\n clusterName: string;\n}\n\n/**\n * Retrieves the events for the given object\n *\n * @public\n */\nexport const useEvents = ({\n involvedObjectName,\n namespace,\n clusterName,\n}: EventsOptions) => {\n const kubernetesProxyApi = useApi(kubernetesProxyApiRef);\n return useAsync(async () => {\n return await kubernetesProxyApi.getEventsByInvolvedObjectName({\n involvedObjectName,\n namespace,\n clusterName,\n });\n }, [involvedObjectName, namespace, clusterName]);\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n Avatar,\n Container,\n Grid,\n List,\n ListItem,\n ListItemAvatar,\n ListItemText,\n Tooltip,\n Typography,\n} from '@material-ui/core';\n\nimport InfoIcon from '@material-ui/icons/Info';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport { DateTime } from 'luxon';\n\nimport { useEvents } from './useEvents';\nimport { Skeleton } from '@material-ui/lab';\nimport { DismissableBanner } from '@backstage/core-components';\nimport { Event } from 'kubernetes-models/v1';\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsContentProps {\n warningEventsOnly?: boolean;\n events: Event[];\n}\n\nconst getAvatarByType = (type?: string) => {\n return (\n <ListItemAvatar>\n <Avatar>{type === 'Warning' ? <WarningIcon /> : <InfoIcon />}</Avatar>\n </ListItemAvatar>\n );\n};\n\n/**\n * Shows given Kubernetes events\n *\n * @public\n */\nexport const EventsContent = ({\n events,\n warningEventsOnly,\n}: EventsContentProps) => {\n if (events.length === 0) {\n return <Typography>No events found</Typography>;\n }\n\n return (\n <Container>\n <Grid>\n <List>\n {events\n .filter(event => {\n if (warningEventsOnly) {\n return event.type === 'Warning';\n }\n return true;\n })\n .map(event => {\n const timeAgo = event.metadata.creationTimestamp\n ? DateTime.fromISO(event.metadata.creationTimestamp).toRelative(\n {\n locale: 'en',\n },\n )\n : 'unknown';\n return (\n <ListItem key={event.metadata.name}>\n <Tooltip title={`${event.type ?? ''} event`}>\n {getAvatarByType(event.type)}\n </Tooltip>\n <ListItemText\n primary={`First event ${timeAgo} (count: ${event.count})`}\n secondary={`${event.reason}: ${event.message}`}\n />\n </ListItem>\n );\n })}\n </List>\n </Grid>\n </Container>\n );\n};\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsProps {\n involvedObjectName: string;\n namespace: string;\n clusterName: string;\n warningEventsOnly?: boolean;\n}\n\n/**\n * Retrieves and shows Kubernetes events for the given object\n *\n * @public\n */\nexport const Events = ({\n involvedObjectName,\n namespace,\n clusterName,\n warningEventsOnly,\n}: EventsProps) => {\n const { value, error, loading } = useEvents({\n involvedObjectName,\n namespace,\n clusterName,\n });\n\n return (\n <>\n {error && (\n <DismissableBanner\n {...{\n message: error.message,\n variant: 'error',\n fixed: false,\n }}\n id=\"events\"\n />\n )}\n {loading && <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />}\n {!loading && value !== undefined && (\n <EventsContent warningEventsOnly={warningEventsOnly} events={value} />\n )}\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState } from 'react';\n\nimport { Button, Grid } from '@material-ui/core';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport IconButton from '@material-ui/core/IconButton';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport CloseIcon from '@material-ui/icons/Close';\nimport HelpIcon from '@material-ui/icons/Help';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\n\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { DetectedError } from '@backstage/plugin-kubernetes-common';\nimport { PodLogs } from '../PodLogs';\nimport { Events } from '../Events';\nimport { LinkButton } from '@backstage/core-components';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\n/**\n * Props for FixDialog\n *\n * @public\n */\nexport interface FixDialogProps {\n open?: boolean;\n clusterName: string;\n pod: Pod;\n error: DetectedError;\n}\n\n/**\n * A dialog for fixing detected Kubernetes errors\n *\n * @public\n */\nexport const FixDialog: React.FC<FixDialogProps> = ({\n open,\n pod,\n error,\n clusterName,\n}: FixDialogProps) => {\n const [isOpen, setOpen] = useState(!!open);\n const classes = useStyles();\n\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n\n const pf = error.proposedFix;\n\n const dialogContent = () => {\n return (\n <Grid container>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Detected error:</Typography>\n <Typography>{error.message}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Cause explanation:</Typography>\n <Typography>\n {error.proposedFix?.rootCauseExplanation ?? 'unknown'}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Fix:</Typography>\n <Typography>\n <ul>\n {(error.proposedFix?.actions ?? []).map((fix, i) => {\n return (\n <li key={`${pod.metadata?.name ?? 'unknown'}-pf-${i}`}>\n {fix}\n </li>\n );\n })}\n </ul>\n </Typography>\n </Grid>\n\n {pf && pf.type === 'logs' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Crash logs:</Typography>\n </Grid>\n <Grid item xs={9}>\n <PodLogs\n previous\n containerScope={{\n podName: pod.metadata?.name ?? 'unknown',\n podNamespace: pod.metadata?.namespace ?? 'unknown',\n clusterName: clusterName,\n containerName: pf.container,\n }}\n />\n </Grid>\n </>\n )}\n {pf && pf.type === 'events' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Events:</Typography>\n </Grid>\n <Grid item xs={9}>\n <Events\n warningEventsOnly\n involvedObjectName={pod.metadata?.name ?? ''}\n namespace={pod.metadata?.namespace ?? ''}\n clusterName={clusterName}\n />\n </Grid>\n </>\n )}\n </Grid>\n );\n };\n\n return (\n <>\n <Button\n variant=\"outlined\"\n aria-label=\"fix issue\"\n component=\"label\"\n onClick={openDialog}\n startIcon={<HelpIcon />}\n >\n Help\n </Button>\n <Dialog maxWidth=\"xl\" fullWidth open={isOpen} onClose={closeDialog}>\n <DialogTitle id=\"dialog-title\">\n {pod.metadata?.name} - {error.type}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent>{dialogContent()}</DialogContent>\n <DialogActions>\n {pf && pf.type === 'docs' && (\n <LinkButton\n to={pf.docsLink}\n variant=\"outlined\"\n startIcon={<OpenInNewIcon />}\n target=\"_blank\"\n rel=\"noopener\"\n >\n Open docs\n </LinkButton>\n )}\n </DialogActions>\n </Dialog>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n List,\n ListItem,\n ListItemText,\n Divider,\n createStyles,\n makeStyles,\n Theme,\n Paper,\n Grid,\n} from '@material-ui/core';\nimport { PodAndErrors } from '../types';\nimport { FixDialog } from '../FixDialog/FixDialog';\n\nconst useStyles = makeStyles((_theme: Theme) =>\n createStyles({\n root: {\n overflow: 'auto',\n },\n list: {\n width: '100%',\n },\n }),\n);\n\n/**\n * Props for ErrorList\n *\n * @public\n */\nexport interface ErrorListProps {\n podAndErrors: PodAndErrors[];\n}\n\n/**\n * Shows a list of errors found on a Pod\n *\n * @public\n */\nexport const ErrorList = ({ podAndErrors }: ErrorListProps) => {\n const classes = useStyles();\n return (\n <Paper className={classes.root}>\n <List className={classes.list}>\n {podAndErrors\n .filter(pae => pae.errors.length > 0)\n .flatMap(onlyPodWithErrors => {\n return onlyPodWithErrors.errors.map((error, i) => {\n return (\n <React.Fragment\n key={`${\n onlyPodWithErrors.pod.metadata?.name ?? 'unknown'\n }-eli-${i}`}\n >\n {i > 0 && <Divider key={`error-divider${i}`} />}\n <ListItem>\n <Grid container>\n <Grid item xs={9}>\n <ListItemText\n primary={error.message}\n secondary={onlyPodWithErrors.pod.metadata?.name}\n />\n </Grid>\n <Grid item xs={3}>\n <FixDialog\n pod={onlyPodWithErrors.pod}\n error={error}\n clusterName={onlyPodWithErrors.clusterName}\n />\n </Grid>\n </Grid>\n </ListItem>\n </React.Fragment>\n );\n });\n })}\n </List>\n </Paper>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\n\nimport { ItemCardGrid } from '@backstage/core-components';\nimport {\n createStyles,\n makeStyles,\n Theme,\n Grid,\n Typography,\n} from '@material-ui/core';\n\nimport { Pod } from 'kubernetes-models/v1';\n\nimport { ContainerCard } from './ContainerCard';\n\nimport { PodAndErrors } from '../types';\nimport { KubernetesDrawer } from '../../KubernetesDrawer';\nimport { PendingPodContent } from './PendingPodContent';\nimport { ErrorList } from '../ErrorList';\nimport { usePodMetrics } from '../../../hooks/usePodMetrics';\nimport { ResourceUtilization } from '../../ResourceUtilization';\nimport { bytesToMiB, formatMillicores } from '../../../utils/resources';\n\nconst useDrawerContentStyles = makeStyles((_theme: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n content: {\n height: '80%',\n },\n icon: {\n fontSize: 20,\n },\n podoklist: {\n width: '100%',\n maxWidth: 360,\n maxHeight: 360,\n },\n }),\n);\n\nfunction getContainerSpecByName(pod: Pod, containerName: string) {\n return pod.spec?.containers.find(c => c.name === containerName);\n}\n\n/**\n * Props for PodDrawer\n *\n * @public\n */\nexport interface PodDrawerProps {\n open?: boolean;\n podAndErrors: PodAndErrors;\n}\n\n/**\n * A Drawer for Kubernetes Pods\n *\n * @public\n */\nexport const PodDrawer = ({ podAndErrors, open }: PodDrawerProps) => {\n const classes = useDrawerContentStyles();\n const podMetrics = usePodMetrics(podAndErrors.clusterName, podAndErrors.pod);\n\n return (\n <KubernetesDrawer\n open={open}\n drawerContentsHeader={\n <Typography variant=\"subtitle1\">\n Pod{' '}\n {podAndErrors.pod.status?.podIP &&\n `(${podAndErrors.pod.status?.podIP})`}\n </Typography>\n }\n kubernetesObject={podAndErrors.pod}\n label={\n <Typography variant=\"subtitle1\">\n {podAndErrors.pod.metadata?.name ?? 'unknown'}\n </Typography>\n }\n >\n <div className={classes.content}>\n {podMetrics && (\n <Grid container item xs={12}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Resource utilization</Typography>\n </Grid>\n <Grid item xs={6}>\n <ResourceUtilization\n title=\"CPU requests\"\n usage={podMetrics.cpu.currentUsage}\n total={podMetrics.cpu.requestTotal}\n totalFormatted={formatMillicores(podMetrics.cpu.requestTotal)}\n />\n <ResourceUtilization\n title=\"CPU limits\"\n usage={podMetrics.cpu.currentUsage}\n total={podMetrics.cpu.limitTotal}\n totalFormatted={formatMillicores(podMetrics.cpu.limitTotal)}\n />\n </Grid>\n <Grid item xs={6}>\n <ResourceUtilization\n title=\"Memory requests\"\n usage={podMetrics.memory.currentUsage}\n total={podMetrics.memory.requestTotal}\n totalFormatted={bytesToMiB(podMetrics.memory.requestTotal)}\n />\n <ResourceUtilization\n title=\"Memory limits\"\n usage={podMetrics.memory.currentUsage}\n total={podMetrics.memory.limitTotal}\n totalFormatted={bytesToMiB(podMetrics.memory.requestTotal)}\n />\n </Grid>\n </Grid>\n )}\n {podAndErrors.pod.status?.phase === 'Pending' && (\n <PendingPodContent pod={podAndErrors.pod} />\n )}\n {podAndErrors.pod.status?.containerStatuses?.length && (\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Containers</Typography>\n </Grid>\n <Grid item xs={12}>\n <ItemCardGrid>\n {podAndErrors.pod.status?.containerStatuses?.map(\n (containerStatus, i) => {\n const containerSpec = getContainerSpecByName(\n podAndErrors.pod,\n containerStatus.name,\n );\n const containerMetrics = (\n podMetrics?.containers ?? []\n ).find(c => c.container === containerStatus.name);\n return (\n <ContainerCard\n key={`container-card-${podAndErrors.pod.metadata?.name}-${i}`}\n containerMetrics={containerMetrics}\n podScope={{\n podName: podAndErrors.pod.metadata?.name ?? 'unknown',\n podNamespace:\n podAndErrors.pod.metadata?.namespace ?? 'unknown',\n clusterName: podAndErrors.clusterName,\n }}\n containerSpec={containerSpec}\n containerStatus={containerStatus}\n />\n );\n },\n )}\n </ItemCardGrid>\n </Grid>\n {podAndErrors.errors.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h5\">Errors</Typography>\n </Grid>\n )}\n {podAndErrors.errors.length > 0 && (\n <Grid item xs={12}>\n <ErrorList podAndErrors={[podAndErrors]} />\n </Grid>\n )}\n </Grid>\n )}\n </div>\n </KubernetesDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n V1Pod,\n V1PodCondition,\n V1DeploymentCondition,\n} from '@kubernetes/client-node';\nimport React, { Fragment, ReactNode } from 'react';\nimport { Chip } from '@material-ui/core';\nimport {\n StatusAborted,\n StatusError,\n StatusOK,\n SubvalueCell,\n} from '@backstage/core-components';\nimport { ClientPodStatus } from '@backstage/plugin-kubernetes-common';\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { bytesToMiB, formatMillicores } from './resources';\n\nexport const imageChips = (pod: V1Pod): ReactNode => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n const images = containerStatuses.map((cs, i) => {\n return <Chip key={i} label={`${cs.name}=${cs.image}`} size=\"small\" />;\n });\n\n return <div>{images}</div>;\n};\n\nexport const containersReady = (pod: Pod): string => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n const containersReadyItem = containerStatuses.filter(cs => cs.ready).length;\n\n return `${containersReadyItem}/${containerStatuses.length}`;\n};\n\nexport const totalRestarts = (pod: Pod): number => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n return containerStatuses?.reduce((a, b) => a + b.restartCount, 0);\n};\n\nexport const containerStatuses = (pod: Pod): ReactNode => {\n const containerStatusesItem = pod.status?.containerStatuses ?? [];\n const errors = containerStatusesItem.reduce((accum, next) => {\n if (next.state === undefined) {\n return accum;\n }\n\n const waiting = next.state.waiting;\n const terminated = next.state.terminated;\n\n const renderCell = (reason: string | undefined) => (\n <Fragment key={`${pod.metadata?.name}-${next.name}`}>\n <SubvalueCell\n value={\n reason === 'Completed' ? (\n <StatusOK>Container: {next.name}</StatusOK>\n ) : (\n <StatusError>Container: {next.name}</StatusError>\n )\n }\n subvalue={reason}\n />\n <br />\n </Fragment>\n );\n\n if (waiting) {\n accum.push(renderCell(waiting.reason));\n }\n\n if (terminated) {\n accum.push(renderCell(terminated.reason));\n }\n\n return accum;\n }, [] as React.ReactNode[]);\n\n if (errors.length === 0) {\n return <StatusOK>OK</StatusOK>;\n }\n\n return errors;\n};\n\nexport const renderCondition = (\n condition: V1PodCondition | V1DeploymentCondition,\n): [string, ReactNode] => {\n const status = condition.status;\n\n if (status === 'True') {\n return [condition.type, <StatusOK>True</StatusOK>];\n } else if (status === 'False') {\n return [\n condition.type,\n <SubvalueCell\n value={<StatusError>False</StatusError>}\n subvalue={condition.message ?? ''}\n />,\n ];\n }\n return [condition.type, <StatusAborted />];\n};\n\n// visible for testing\nexport const currentToDeclaredResourceToPerc = (\n current: number | string,\n resource: number | string,\n): string => {\n if (Number(resource) === 0) return `0%`;\n\n if (typeof current === 'number' && typeof resource === 'number') {\n return `${Math.round((current / resource) * 100)}%`;\n }\n\n const numerator: bigint = BigInt(\n typeof current === 'number' ? Math.round(current) : current,\n );\n const denominator: bigint = BigInt(\n typeof resource === 'number' ? Math.round(resource) : resource,\n );\n\n return `${(numerator * BigInt(100)) / denominator}%`;\n};\n\nexport const podStatusToCpuUtil = (podStatus: ClientPodStatus): ReactNode => {\n const cpuUtil = podStatus.cpu;\n\n let currentUsage: number | string = cpuUtil.currentUsage;\n\n // current usage number for CPU is a different unit than request/limit total\n // this might be a bug in the k8s library\n if (typeof cpuUtil.currentUsage === 'number') {\n currentUsage = cpuUtil.currentUsage / 10;\n }\n\n return (\n <SubvalueCell\n value={`requests: ${currentToDeclaredResourceToPerc(\n currentUsage,\n cpuUtil.requestTotal,\n )} of ${formatMillicores(cpuUtil.requestTotal)}`}\n subvalue={`limits: ${currentToDeclaredResourceToPerc(\n currentUsage,\n cpuUtil.limitTotal,\n )} of ${formatMillicores(cpuUtil.limitTotal)}`}\n />\n );\n};\n\nexport const podStatusToMemoryUtil = (\n podStatus: ClientPodStatus,\n): ReactNode => {\n const memUtil = podStatus.memory;\n\n return (\n <SubvalueCell\n value={`requests: ${currentToDeclaredResourceToPerc(\n memUtil.currentUsage,\n memUtil.requestTotal,\n )} of ${bytesToMiB(memUtil.requestTotal)}`}\n subvalue={`limits: ${currentToDeclaredResourceToPerc(\n memUtil.currentUsage,\n memUtil.limitTotal,\n )} of ${bytesToMiB(memUtil.limitTotal)}`}\n />\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport { PodDrawer } from './PodDrawer';\nimport {\n containersReady,\n containerStatuses,\n podStatusToCpuUtil,\n podStatusToMemoryUtil,\n totalRestarts,\n} from '../../utils/pod';\nimport { Table, TableColumn } from '@backstage/core-components';\nimport { ClusterContext } from '../../hooks/Cluster';\nimport { useMatchingErrors } from '../../hooks/useMatchingErrors';\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { V1Pod } from '@kubernetes/client-node';\nimport { usePodMetrics } from '../../hooks/usePodMetrics';\nimport { Typography } from '@material-ui/core';\n\n/**\n *\n *\n * @public\n */\nexport const READY_COLUMNS: PodColumns = 'READY';\n\n/**\n *\n *\n * @public\n */\nexport const RESOURCE_COLUMNS: PodColumns = 'RESOURCE';\n\n/**\n *\n *\n * @public\n */\nexport type PodColumns = 'READY' | 'RESOURCE';\n\n/**\n *\n *\n * @public\n */\nexport type PodsTablesProps = {\n pods: Pod | V1Pod[];\n extraColumns?: PodColumns[];\n children?: React.ReactNode;\n};\n\nconst READY: TableColumn<Pod>[] = [\n {\n title: 'containers ready',\n align: 'center',\n render: containersReady,\n width: 'auto',\n },\n {\n title: 'total restarts',\n align: 'center',\n render: totalRestarts,\n type: 'numeric',\n width: 'auto',\n },\n];\n\nconst PodDrawerTrigger = ({ pod }: { pod: Pod }) => {\n const cluster = useContext(ClusterContext);\n const errors = useMatchingErrors({\n kind: 'Pod',\n apiVersion: 'v1',\n metadata: pod.metadata,\n });\n return (\n <PodDrawer\n podAndErrors={{\n pod: pod as any,\n clusterName: cluster.name,\n errors: errors,\n }}\n />\n );\n};\n\nconst Cpu = ({ clusterName, pod }: { clusterName: string; pod: Pod }) => {\n const metrics = usePodMetrics(clusterName, pod);\n\n if (!metrics) {\n return <Typography>unknown</Typography>;\n }\n\n return <>{podStatusToCpuUtil(metrics)}</>;\n};\n\nconst Memory = ({ clusterName, pod }: { clusterName: string; pod: Pod }) => {\n const metrics = usePodMetrics(clusterName, pod);\n\n if (!metrics) {\n return <Typography>unknown</Typography>;\n }\n\n return <>{podStatusToMemoryUtil(metrics)}</>;\n};\n\n/**\n *\n *\n * @public\n */\nexport const PodsTable = ({ pods, extraColumns = [] }: PodsTablesProps) => {\n const cluster = useContext(ClusterContext);\n const defaultColumns: TableColumn<Pod>[] = [\n {\n title: 'ID',\n field: 'metadata.uid',\n hidden: true,\n },\n {\n title: 'name',\n highlight: true,\n render: (pod: Pod) => {\n return <PodDrawerTrigger pod={pod} />;\n },\n },\n {\n title: 'phase',\n render: (pod: Pod) => pod.status?.phase ?? 'unknown',\n width: 'auto',\n },\n {\n title: 'status',\n render: containerStatuses,\n },\n ];\n const columns: TableColumn<Pod>[] = [...defaultColumns];\n\n if (extraColumns.includes(READY_COLUMNS)) {\n columns.push(...READY);\n }\n if (extraColumns.includes(RESOURCE_COLUMNS)) {\n const resourceColumns: TableColumn<Pod>[] = [\n {\n title: 'CPU usage %',\n render: (pod: Pod) => {\n return <Cpu clusterName={cluster.name} pod={pod} />;\n },\n width: 'auto',\n },\n {\n title: 'Memory usage %',\n render: (pod: Pod) => {\n return <Memory clusterName={cluster.name} pod={pod} />;\n },\n width: 'auto',\n },\n ];\n columns.push(...resourceColumns);\n }\n\n const tableStyle = {\n minWidth: '0',\n width: '100%',\n };\n\n return (\n <div style={tableStyle}>\n <Table\n options={{ paging: true, search: false, emptyRowsWhenPaging: false }}\n // It was observed that in some instances the pod drawer closes when new data (like CPU usage) is available and the table reloads.\n // Mapping the metadata UID to the tables ID fixes this problem.\n data={\n (pods as Pod[]).map((pod: Pod) => ({\n ...pod,\n id: pod?.metadata?.uid,\n })) as any as Pod[]\n }\n columns={columns}\n />\n </div>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1Deployment } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { renderCondition } from '../../utils/pod';\nimport { Typography, Grid, Chip } from '@material-ui/core';\n\nexport const DeploymentDrawer = ({\n deployment,\n expanded,\n}: {\n deployment: V1Deployment;\n expanded?: boolean;\n}) => {\n const namespace = deployment.metadata?.namespace;\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={deployment}\n expanded={expanded}\n kind=\"Deployment\"\n renderObject={(deploymentObj: V1Deployment) => {\n const conditions = (deploymentObj.status?.conditions ?? [])\n .map(renderCondition)\n .reduce((accum, next) => {\n accum[next[0]] = next[1];\n return accum;\n }, {} as { [key: string]: React.ReactNode });\n\n return {\n strategy: deploymentObj.spec?.strategy ?? '???',\n minReadySeconds: deploymentObj.spec?.minReadySeconds ?? '???',\n progressDeadlineSeconds:\n deploymentObj.spec?.progressDeadlineSeconds ?? '???',\n ...conditions,\n };\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {deployment.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Deployment\n </Typography>\n </Grid>\n {namespace && (\n <Grid item>\n <Chip size=\"small\" label={`namespace: ${namespace}`} />\n </Grid>\n )}\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1HorizontalPodAutoscaler } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\n\n/** @public */\nexport const HorizontalPodAutoscalerDrawer = (props: {\n hpa: V1HorizontalPodAutoscaler;\n expanded?: boolean;\n children?: React.ReactNode;\n}) => {\n const { hpa, expanded, children } = props;\n\n return (\n <KubernetesStructuredMetadataTableDrawer\n kind=\"HorizontalPodAutoscaler\"\n object={hpa}\n expanded={expanded}\n renderObject={(hpaObject: V1HorizontalPodAutoscaler) => {\n return {\n targetCPUUtilizationPercentage:\n hpaObject.spec?.targetCPUUtilizationPercentage,\n currentCPUUtilizationPercentage:\n hpaObject.status?.currentCPUUtilizationPercentage,\n minReplicas: hpaObject.spec?.minReplicas,\n maxReplicas: hpaObject.spec?.maxReplicas,\n currentReplicas: hpaObject.status?.currentReplicas,\n desiredReplicas: hpaObject.status?.desiredReplicas,\n };\n }}\n >\n {children}\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { V1ObjectMeta } from '@kubernetes/client-node/dist/gen/model/v1ObjectMeta';\nimport {\n V1HorizontalPodAutoscaler,\n V1Pod,\n V1ReplicaSet,\n} from '@kubernetes/client-node';\n\ninterface CanOwn {\n metadata?: V1ObjectMeta;\n}\n\ninterface CanBeOwned {\n metadata?: V1ObjectMeta;\n}\n\nexport function getOwnedResources<R extends CanBeOwned>(\n potentialOwner: CanOwn,\n possiblyOwned: R[],\n): R[] {\n return possiblyOwned.filter(\n p =>\n p.metadata?.ownerReferences?.some(\n o => o.uid === potentialOwner.metadata?.uid,\n ) ?? false,\n );\n}\n\nexport const getOwnedPodsThroughReplicaSets = (\n potentialOwner: CanOwn,\n replicaSets: V1ReplicaSet[],\n pods: V1Pod[],\n) => {\n return getOwnedResources(\n potentialOwner,\n replicaSets.filter(rs => rs.status && rs.status.replicas > 0),\n ).reduce((accum, rs) => {\n return accum.concat(getOwnedResources(rs, pods));\n }, [] as V1Pod[]);\n};\n\ninterface ResourceRef {\n kind: string;\n namespace?: string;\n name?: string;\n}\n\nexport const getMatchingHpa = (\n owner: ResourceRef,\n hpas: V1HorizontalPodAutoscaler[],\n): V1HorizontalPodAutoscaler | undefined => {\n return hpas.find(hpa => {\n return (\n (hpa.spec?.scaleTargetRef?.kind ?? '').toLocaleLowerCase('en-US') ===\n owner.kind.toLocaleLowerCase('en-US') &&\n (hpa.metadata?.namespace ?? '') ===\n (owner.namespace ?? 'unknown-namespace') &&\n (hpa.spec?.scaleTargetRef?.name ?? '') ===\n (owner.name ?? 'unknown-deployment')\n );\n });\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport {\n V1Deployment,\n V1Pod,\n V1HorizontalPodAutoscaler,\n} from '@kubernetes/client-node';\nimport { PodsTable } from '../Pods';\nimport { DeploymentDrawer } from './DeploymentDrawer';\nimport { HorizontalPodAutoscalerDrawer } from '../HorizontalPodAutoscalers';\nimport {\n getOwnedPodsThroughReplicaSets,\n getMatchingHpa,\n} from '../../utils/owner';\nimport {\n GroupedResponsesContext,\n PodNamesWithErrorsContext,\n} from '../../hooks';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { READY_COLUMNS, RESOURCE_COLUMNS } from '../Pods/PodsTable';\n\ntype DeploymentsAccordionsProps = {\n children?: React.ReactNode;\n};\n\ntype DeploymentAccordionProps = {\n deployment: V1Deployment;\n ownedPods: V1Pod[];\n matchingHpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\ntype DeploymentSummaryProps = {\n deployment: V1Deployment;\n numberOfCurrentPods: number;\n numberOfPodsWithErrors: number;\n hpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\nconst DeploymentSummary = ({\n deployment,\n numberOfCurrentPods,\n numberOfPodsWithErrors,\n hpa,\n}: DeploymentSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={4} item>\n <DeploymentDrawer deployment={deployment} />\n </Grid>\n {hpa && (\n <Grid item xs={4}>\n <HorizontalPodAutoscalerDrawer hpa={hpa}>\n <Grid\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"subtitle2\">\n min replicas {hpa.spec?.minReplicas ?? '?'} / max replicas{' '}\n {hpa.spec?.maxReplicas ?? '?'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n current CPU usage:{' '}\n {hpa.status?.currentCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n target CPU usage:{' '}\n {hpa.spec?.targetCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n </Grid>\n </HorizontalPodAutoscalerDrawer>\n </Grid>\n )}\n <Grid\n item\n container\n xs={4}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{numberOfCurrentPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>\n {numberOfPodsWithErrors} pod\n {numberOfPodsWithErrors > 1 ? 's' : ''} with errors\n </StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\nconst DeploymentAccordion = ({\n deployment,\n ownedPods,\n matchingHpa,\n}: DeploymentAccordionProps) => {\n const podNamesWithErrors = useContext(PodNamesWithErrorsContext);\n\n const podsWithErrors = ownedPods.filter(p =>\n podNamesWithErrors.has(p.metadata?.name ?? ''),\n );\n\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <DeploymentSummary\n deployment={deployment}\n numberOfCurrentPods={ownedPods.length}\n numberOfPodsWithErrors={podsWithErrors.length}\n hpa={matchingHpa}\n />\n </AccordionSummary>\n <AccordionDetails>\n <PodsTable\n pods={ownedPods}\n extraColumns={[READY_COLUMNS, RESOURCE_COLUMNS]}\n />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const DeploymentsAccordions = ({}: DeploymentsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.deployments.map((deployment, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <DeploymentAccordion\n matchingHpa={getMatchingHpa(\n {\n name: deployment.metadata?.name,\n namespace: deployment.metadata?.namespace,\n kind: 'deployment',\n },\n groupedResponses.horizontalPodAutoscalers,\n )}\n ownedPods={getOwnedPodsThroughReplicaSets(\n deployment,\n groupedResponses.replicaSets,\n groupedResponses.pods,\n )}\n deployment={deployment}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1StatefulSet } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { renderCondition } from '../../utils/pod';\nimport { Typography, Grid, Chip } from '@material-ui/core';\n\nexport const StatefulSetDrawer = ({\n statefulset,\n expanded,\n}: {\n statefulset: V1StatefulSet;\n expanded?: boolean;\n}) => {\n const namespace = statefulset.metadata?.namespace;\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={statefulset}\n expanded={expanded}\n kind=\"StatefulSet\"\n renderObject={(statefulsetObj: V1StatefulSet) => {\n const conditions = (statefulsetObj.status?.conditions ?? [])\n .map(renderCondition)\n .reduce((accum, next) => {\n accum[next[0]] = next[1];\n return accum;\n }, {} as { [key: string]: React.ReactNode });\n\n return {\n updateStrategy: statefulset.spec?.updateStrategy ?? '???',\n podManagementPolicy: statefulset.spec?.podManagementPolicy ?? '???',\n serviceName: statefulset.spec?.serviceName ?? '???',\n selector: statefulset.spec?.selector ?? '???',\n revisionHistoryLimit: statefulset.spec?.revisionHistoryLimit ?? '???',\n ...conditions,\n };\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {statefulset.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Stateful Set\n </Typography>\n </Grid>\n {namespace && (\n <Grid item>\n <Chip size=\"small\" label={`namespace: ${namespace}`} />\n </Grid>\n )}\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport {\n V1Pod,\n V1HorizontalPodAutoscaler,\n V1StatefulSet,\n} from '@kubernetes/client-node';\nimport { PodsTable } from '../Pods';\nimport { StatefulSetDrawer } from './StatefulSetDrawer';\nimport { HorizontalPodAutoscalerDrawer } from '../HorizontalPodAutoscalers';\nimport { getMatchingHpa, getOwnedResources } from '../../utils/owner';\nimport {\n GroupedResponsesContext,\n PodNamesWithErrorsContext,\n} from '../../hooks';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { READY_COLUMNS, RESOURCE_COLUMNS } from '../Pods/PodsTable';\n\ntype StatefulSetsAccordionsProps = {\n children?: React.ReactNode;\n};\n\ntype StatefulSetAccordionProps = {\n statefulset: V1StatefulSet;\n ownedPods: V1Pod[];\n matchingHpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\ntype StatefulSetSummaryProps = {\n statefulset: V1StatefulSet;\n numberOfCurrentPods: number;\n numberOfPodsWithErrors: number;\n hpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\nconst StatefulSetSummary = ({\n statefulset,\n numberOfCurrentPods,\n numberOfPodsWithErrors,\n hpa,\n}: StatefulSetSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <StatefulSetDrawer statefulset={statefulset} />\n </Grid>\n {hpa && (\n <Grid item xs={3}>\n <HorizontalPodAutoscalerDrawer hpa={hpa}>\n <Grid\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"subtitle2\">\n min replicas {hpa.spec?.minReplicas ?? '?'} / max replicas{' '}\n {hpa.spec?.maxReplicas ?? '?'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n current CPU usage:{' '}\n {hpa.status?.currentCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n target CPU usage:{' '}\n {hpa.spec?.targetCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n </Grid>\n </HorizontalPodAutoscalerDrawer>\n </Grid>\n )}\n <Grid\n item\n container\n xs={3}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{numberOfCurrentPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>\n {numberOfPodsWithErrors} pod\n {numberOfPodsWithErrors > 1 ? 's' : ''} with errors\n </StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\nconst StatefulSetAccordion = ({\n statefulset,\n ownedPods,\n matchingHpa,\n}: StatefulSetAccordionProps) => {\n const podNamesWithErrors = useContext(PodNamesWithErrorsContext);\n\n const podsWithErrors = ownedPods.filter(p =>\n podNamesWithErrors.has(p.metadata?.name ?? ''),\n );\n\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <StatefulSetSummary\n statefulset={statefulset}\n numberOfCurrentPods={ownedPods.length}\n numberOfPodsWithErrors={podsWithErrors.length}\n hpa={matchingHpa}\n />\n </AccordionSummary>\n <AccordionDetails>\n <PodsTable\n pods={ownedPods}\n extraColumns={[READY_COLUMNS, RESOURCE_COLUMNS]}\n />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const StatefulSetsAccordions = ({}: StatefulSetsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.statefulsets.map((statefulset, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <StatefulSetAccordion\n matchingHpa={getMatchingHpa(\n {\n name: statefulset.metadata?.name,\n namespace: statefulset.metadata?.namespace,\n kind: 'statefulset',\n },\n groupedResponses.horizontalPodAutoscalers,\n )}\n ownedPods={getOwnedResources(statefulset, groupedResponses.pods)}\n statefulset={statefulset}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1Ingress } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const IngressDrawer = ({\n ingress,\n expanded,\n}: {\n ingress: V1Ingress;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={ingress}\n expanded={expanded}\n kind=\"Ingress\"\n renderObject={(ingressObject: V1Ingress) => {\n return ingressObject.spec || {};\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {ingress.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Ingress\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Ingress } from '@kubernetes/client-node';\nimport { IngressDrawer } from './IngressDrawer';\nimport { GroupedResponsesContext } from '../../hooks';\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\n/**\n *\n *\n * @public\n */\nexport type IngressesAccordionsProps = {};\n\ntype IngressAccordionProps = {\n ingress: V1Ingress;\n};\n\ntype IngressSummaryProps = {\n ingress: V1Ingress;\n};\n\nconst IngressSummary = ({ ingress }: IngressSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n >\n <Grid xs={12} item>\n <IngressDrawer ingress={ingress} />\n </Grid>\n </Grid>\n );\n};\n\ntype IngressCardProps = {\n ingress: V1Ingress;\n};\n\nconst IngressCard = ({ ingress }: IngressCardProps) => {\n return (\n <StructuredMetadataTable\n metadata={{\n ...ingress.spec,\n }}\n />\n );\n};\n\nconst IngressAccordion = ({ ingress }: IngressAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <IngressSummary ingress={ingress} />\n </AccordionSummary>\n <AccordionDetails>\n <IngressCard ingress={ingress} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\n/**\n *\n *\n * @public\n */\nexport const IngressesAccordions = ({}: IngressesAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.ingresses.map((ingress, i) => (\n <Grid item key={i} xs>\n <IngressAccordion ingress={ingress} />\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1Service } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const ServiceDrawer = ({\n service,\n expanded,\n}: {\n service: V1Service;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={service}\n expanded={expanded}\n kind=\"Service\"\n renderObject={(serviceObject: V1Service) => {\n return serviceObject.spec || {};\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {service.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Service\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Service } from '@kubernetes/client-node';\nimport { ServiceDrawer } from './ServiceDrawer';\nimport { GroupedResponsesContext } from '../../hooks';\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\ntype ServiceSummaryProps = {\n service: V1Service;\n};\n\nconst ServiceSummary = ({ service }: ServiceSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={8} item>\n <ServiceDrawer service={service} />\n </Grid>\n\n <Grid item>\n <Typography variant=\"subtitle2\">\n Type: {service.spec?.type ?? '?'}\n </Typography>\n </Grid>\n </Grid>\n );\n};\n\ntype ServiceCardProps = {\n service: V1Service;\n};\n\nconst ServiceCard = ({ service }: ServiceCardProps) => {\n const metadata: any = {};\n\n if (service.status?.loadBalancer?.ingress?.length ?? -1 > 0) {\n metadata.loadbalancer = service.status?.loadBalancer;\n }\n\n if (service.spec?.type === 'ClusterIP') {\n metadata.clusterIP = service.spec.clusterIP;\n }\n if (service.spec?.type === 'ExternalName') {\n metadata.externalName = service.spec.externalName;\n }\n\n return (\n <StructuredMetadataTable\n metadata={{\n type: service.spec?.type,\n ports: service.spec?.ports,\n ...metadata,\n }}\n />\n );\n};\n\n/**\n *\n *\n * @public\n */\nexport type ServicesAccordionsProps = {};\n\ntype ServiceAccordionProps = {\n service: V1Service;\n};\n\nconst ServiceAccordion = ({ service }: ServiceAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <ServiceSummary service={service} />\n </AccordionSummary>\n <AccordionDetails>\n <ServiceCard service={service} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\n/**\n *\n *\n * @public\n */\nexport const ServicesAccordions = ({}: ServicesAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.services.map((service, i) => (\n <Grid item key={i} xs>\n <ServiceAccordion service={service} />\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { V1Job } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const JobDrawer = ({\n job,\n expanded,\n}: {\n job: V1Job;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={job}\n expanded={expanded}\n kind=\"Job\"\n renderObject={(jobObj: V1Job) => {\n return {\n parallelism: jobObj.spec?.parallelism ?? '???',\n completions: jobObj.spec?.completions ?? '???',\n backoffLimit: jobObj.spec?.backoffLimit ?? '???',\n startTime: jobObj.status?.startTime ?? '???',\n };\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {job.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Job\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Job, V1Pod } from '@kubernetes/client-node';\nimport { PodsTable } from '../Pods';\nimport { JobDrawer } from './JobsDrawer';\nimport { getOwnedResources } from '../../utils/owner';\nimport { GroupedResponsesContext } from '../../hooks';\nimport {\n StatusError,\n StatusOK,\n StatusPending,\n} from '@backstage/core-components';\n\n/**\n *\n *\n * @public\n */\nexport type JobsAccordionsProps = {\n jobs: V1Job[];\n children?: React.ReactNode;\n};\n\ntype JobAccordionProps = {\n job: V1Job;\n ownedPods: V1Pod[];\n children?: React.ReactNode;\n};\n\ntype JobSummaryProps = {\n job: V1Job;\n children?: React.ReactNode;\n};\n\nconst JobSummary = ({ job }: JobSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <JobDrawer job={job} />\n </Grid>\n <Grid\n item\n container\n xs={6}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n {job.status?.succeeded && <StatusOK>Succeeded</StatusOK>}\n {job.status?.active && <StatusPending>Running</StatusPending>}\n {job.status?.failed && <StatusError>Failed</StatusError>}\n </Grid>\n <Grid item>Start time: {job.status?.startTime?.toString()}</Grid>\n {job.status?.completionTime && (\n <Grid item>\n Completion time: {job.status.completionTime.toString()}\n </Grid>\n )}\n </Grid>\n </Grid>\n );\n};\n\nconst JobAccordion = ({ job, ownedPods }: JobAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <JobSummary job={job} />\n </AccordionSummary>\n <AccordionDetails>\n <PodsTable pods={ownedPods} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\n/**\n *\n *\n * @public\n */\nexport const JobsAccordions = ({ jobs }: JobsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {jobs.map((job, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <JobAccordion\n ownedPods={getOwnedResources(job, groupedResponses.pods)}\n job={job}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { V1CronJob } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid, Chip } from '@material-ui/core';\n\nexport const CronJobDrawer = ({\n cronJob,\n expanded,\n}: {\n cronJob: V1CronJob;\n expanded?: boolean;\n}) => {\n const namespace = cronJob.metadata?.namespace;\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={cronJob}\n expanded={expanded}\n kind=\"CronJob\"\n renderObject={(cronJobObj: V1CronJob) => ({\n schedule: cronJobObj.spec?.schedule ?? '???',\n startingDeadlineSeconds:\n cronJobObj.spec?.startingDeadlineSeconds ?? '???',\n concurrencyPolicy: cronJobObj.spec?.concurrencyPolicy ?? '???',\n lastScheduleTime: cronJobObj.status?.lastScheduleTime ?? '???',\n })}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {cronJob.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n CronJob\n </Typography>\n </Grid>\n {namespace && (\n <Grid item>\n <Chip size=\"small\" label={`namespace: ${namespace}`} />\n </Grid>\n )}\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport cronstrue from 'cronstrue';\n\n// Defined at https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/\nconst k8sCronAliases = new Map([\n ['@yearly', '0 0 1 1 *'],\n ['@annually', '0 0 1 1 *'],\n ['@monthly', '0 0 1 * *'],\n ['@weekly', '0 0 * * 0'],\n ['@daily', '0 0 * * *'],\n ['@midnight', '0 0 * * *'],\n ['@hourly', '0 * * * *'],\n]);\n\n// humanizeCron takes into account the aliases provided by kubernetes before\n// calling cronstrue. In an effort to not throw an error, it will return the\n// original cron formatted schedule if the cronstrue call fails.\nexport const humanizeCron = (schedule: string): string => {\n const deAliasedSchedule = k8sCronAliases.get(schedule) || schedule;\n try {\n return cronstrue.toString(deAliasedSchedule);\n } catch (e) {\n return deAliasedSchedule;\n }\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1CronJob, V1Job } from '@kubernetes/client-node';\nimport { JobsAccordions } from '../JobsAccordions';\nimport { CronJobDrawer } from './CronJobsDrawer';\nimport { getOwnedResources } from '../../utils/owner';\nimport { GroupedResponsesContext } from '../../hooks';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { humanizeCron } from '../../utils/crons';\n\n/**\n *\n *\n * @public\n */\nexport type CronJobsAccordionsProps = {\n children?: React.ReactNode;\n};\n\ntype CronJobAccordionProps = {\n cronJob: V1CronJob;\n ownedJobs: V1Job[];\n children?: React.ReactNode;\n};\n\ntype CronJobSummaryProps = {\n cronJob: V1CronJob;\n children?: React.ReactNode;\n};\n\nconst CronJobSummary = ({ cronJob }: CronJobSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <CronJobDrawer cronJob={cronJob} />\n </Grid>\n <Grid\n item\n container\n xs={6}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n {cronJob.spec?.suspend ? (\n <StatusError>Suspended</StatusError>\n ) : (\n <StatusOK>Active</StatusOK>\n )}\n </Grid>\n <Grid item>\n <Typography variant=\"body1\">\n Schedule:{' '}\n {cronJob.spec?.schedule\n ? `${cronJob.spec.schedule} (${humanizeCron(\n cronJob.spec.schedule,\n )})`\n : 'N/A'}\n </Typography>\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\nconst CronJobAccordion = ({ cronJob, ownedJobs }: CronJobAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <CronJobSummary cronJob={cronJob} />\n </AccordionSummary>\n <AccordionDetails>\n <JobsAccordions jobs={ownedJobs.reverse()} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\n/**\n *\n *\n * @public\n */\nexport const CronJobsAccordions = ({}: CronJobsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.cronJobs.map((cronJob, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <CronJobAccordion\n ownedJobs={getOwnedResources(cronJob, groupedResponses.jobs)}\n cronJob={cronJob}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { KubernetesStructuredMetadataTableDrawer } from '../../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const RolloutDrawer = ({\n rollout,\n expanded,\n}: {\n rollout: any;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={rollout}\n expanded={expanded}\n kind=\"Rollout\"\n renderObject={() => ({})}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {rollout.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Rollout\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { Step, StepLabel, Stepper } from '@material-ui/core';\nimport Typography from '@material-ui/core/Typography';\nimport {\n ArgoRolloutCanaryStep,\n SetWeightStep,\n PauseStep,\n AnalysisStep,\n} from './types';\n\ninterface StepsProgressProps {\n currentStepIndex: number;\n aborted: boolean;\n steps: ArgoRolloutCanaryStep[];\n children?: React.ReactNode;\n}\n\nconst isSetWeightStep = (step: ArgoRolloutCanaryStep): step is SetWeightStep =>\n step.hasOwnProperty('setWeight');\n\nconst isPauseStep = (step: ArgoRolloutCanaryStep): step is PauseStep =>\n step.hasOwnProperty('pause');\n\nconst isAnalysisStep = (step: ArgoRolloutCanaryStep): step is AnalysisStep =>\n step.hasOwnProperty('analysis');\n\nconst createLabelForStep = (step: ArgoRolloutCanaryStep): React.ReactNode => {\n if (isSetWeightStep(step)) {\n return `setWeight ${step.setWeight}%`;\n } else if (isPauseStep(step)) {\n return step.pause.duration === undefined\n ? 'infinite pause'\n : `pause for ${step.pause.duration}`;\n } else if (isAnalysisStep(step)) {\n return (\n <div>\n <Typography paragraph>analysis templates:</Typography>\n {step.analysis.templates.map((t, i) => (\n <Typography paragraph key={i}>{`${t.templateName}${\n t.clusterScope ? ' (cluster scoped)' : ''\n }`}</Typography>\n ))}\n </div>\n );\n }\n return 'unknown step';\n};\n\nexport const StepsProgress = ({\n currentStepIndex,\n aborted,\n steps,\n}: StepsProgressProps) => {\n // If the activeStep is greater/equal to the number of steps\n // Then the canary is being promoted\n // Increase the step index to mark the 'canary promoted' step as done also\n const activeStepIndex =\n currentStepIndex >= steps.length ? currentStepIndex + 1 : currentStepIndex;\n\n /*\n * When the Rollout is aborted set the active step to -1\n * otherwise it appears to always be on the first step\n */\n return (\n <Stepper activeStep={aborted ? -1 : activeStepIndex} alternativeLabel>\n {steps\n .map((step, i) => (\n <Step key={i}>\n <StepLabel data-testid={`step-${i}`}>\n {createLabelForStep(step)}\n </StepLabel>\n </Step>\n ))\n .concat(\n <Step key=\"-1\">\n <StepLabel data-testid=\"step--1\">Canary promoted</StepLabel>\n </Step>,\n )}\n </Stepper>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Pod, V1HorizontalPodAutoscaler } from '@kubernetes/client-node';\nimport { PodsTable } from '../../Pods';\nimport { HorizontalPodAutoscalerDrawer } from '../../HorizontalPodAutoscalers';\nimport { RolloutDrawer } from './RolloutDrawer';\nimport PauseIcon from '@material-ui/icons/Pause';\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\nimport { DateTime } from 'luxon';\nimport { StepsProgress } from './StepsProgress';\nimport {\n PodNamesWithErrorsContext,\n GroupedResponsesContext,\n} from '../../../hooks';\nimport {\n getMatchingHpa,\n getOwnedPodsThroughReplicaSets,\n} from '../../../utils/owner';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { READY_COLUMNS, RESOURCE_COLUMNS } from '../../Pods/PodsTable';\n\ntype RolloutAccordionsProps = {\n rollouts: any[];\n defaultExpanded?: boolean;\n children?: React.ReactNode;\n};\n\ntype RolloutAccordionProps = {\n rollout: any;\n ownedPods: V1Pod[];\n defaultExpanded?: boolean;\n matchingHpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\ntype RolloutSummaryProps = {\n rollout: any;\n numberOfCurrentPods: number;\n numberOfPodsWithErrors: number;\n hpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\nconst AbortedTitle = (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n }}\n >\n <ErrorOutlineIcon />\n <Typography variant=\"subtitle1\">Aborted</Typography>\n </div>\n);\n\nconst findAbortedMessage = (rollout: any): string | undefined =>\n rollout.status?.conditions?.find(\n (c: any) =>\n c.type === 'Progressing' &&\n c.status === 'False' &&\n c.reason === 'RolloutAborted',\n )?.message;\n\nconst RolloutSummary = ({\n rollout,\n numberOfCurrentPods,\n numberOfPodsWithErrors,\n hpa,\n}: RolloutSummaryProps) => {\n const pauseTime: string | undefined = rollout.status?.pauseConditions?.find(\n (p: any) => p.reason === 'CanaryPauseStep',\n )?.startTime;\n const abortedMessage = findAbortedMessage(rollout);\n\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <RolloutDrawer rollout={rollout} />\n </Grid>\n {hpa && (\n <Grid item xs={3}>\n <HorizontalPodAutoscalerDrawer hpa={hpa}>\n <Grid\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"subtitle2\">\n min replicas {hpa.spec?.minReplicas ?? '?'} / max replicas{' '}\n {hpa.spec?.maxReplicas ?? '?'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n current CPU usage:{' '}\n {hpa.status?.currentCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n target CPU usage:{' '}\n {hpa.spec?.targetCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n </Grid>\n </HorizontalPodAutoscalerDrawer>\n </Grid>\n )}\n <Grid\n item\n container\n xs={3}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{numberOfCurrentPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>\n {numberOfPodsWithErrors} pod\n {numberOfPodsWithErrors > 1 ? 's' : ''} with errors\n </StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n {pauseTime && (\n <Grid item xs={3}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n }}\n >\n <PauseIcon />\n <Typography variant=\"subtitle1\">\n Paused ({DateTime.fromISO(pauseTime).toRelative({ locale: 'en' })}\n )\n </Typography>\n </div>\n </Grid>\n )}\n {abortedMessage && (\n <Grid item xs={3}>\n {AbortedTitle}\n </Grid>\n )}\n </Grid>\n );\n};\n\nconst RolloutAccordion = ({\n rollout,\n ownedPods,\n matchingHpa,\n defaultExpanded,\n}: RolloutAccordionProps) => {\n const podNamesWithErrors = useContext(PodNamesWithErrorsContext);\n\n const podsWithErrors = ownedPods.filter(p =>\n podNamesWithErrors.has(p.metadata?.name ?? ''),\n );\n\n const currentStepIndex = rollout.status?.currentStepIndex ?? 0;\n const abortedMessage = findAbortedMessage(rollout);\n\n return (\n <Accordion\n defaultExpanded={defaultExpanded}\n TransitionProps={{ unmountOnExit: true }}\n variant=\"outlined\"\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <RolloutSummary\n rollout={rollout}\n numberOfCurrentPods={ownedPods.length}\n numberOfPodsWithErrors={podsWithErrors.length}\n hpa={matchingHpa}\n />\n </AccordionSummary>\n <AccordionDetails>\n <div style={{ width: '100%' }}>\n <div>\n <Typography variant=\"h6\">Rollout status</Typography>\n </div>\n <div style={{ margin: '1rem' }}>\n {abortedMessage && (\n <>\n {AbortedTitle}\n <Typography variant=\"subtitle2\">{abortedMessage}</Typography>\n </>\n )}\n <StepsProgress\n aborted={abortedMessage !== undefined}\n steps={rollout.spec?.strategy?.canary?.steps ?? []}\n currentStepIndex={currentStepIndex}\n />\n </div>\n <div>\n <PodsTable\n pods={ownedPods}\n extraColumns={[READY_COLUMNS, RESOURCE_COLUMNS]}\n />\n </div>\n </div>\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const RolloutAccordions = ({\n rollouts,\n defaultExpanded = false,\n}: RolloutAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {rollouts.map((rollout, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <RolloutAccordion\n defaultExpanded={defaultExpanded}\n matchingHpa={getMatchingHpa(\n {\n name: rollout.metadata?.name,\n namespace: rollout.metadata?.namespace,\n kind: 'rollout',\n },\n groupedResponses.horizontalPodAutoscalers,\n )}\n ownedPods={getOwnedPodsThroughReplicaSets(\n rollout,\n groupedResponses.replicaSets,\n groupedResponses.pods,\n )}\n rollout={rollout}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nconst capitalize = (str: string) =>\n str.charAt(0).toLocaleUpperCase('en-US') + str.slice(1);\n\nexport const DefaultCustomResourceDrawer = ({\n customResource,\n customResourceName,\n expanded,\n}: {\n customResource: any;\n customResourceName: string;\n expanded?: boolean;\n}) => {\n const capitalizedName = capitalize(customResourceName);\n\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={customResource}\n expanded={expanded}\n kind={capitalizedName}\n renderObject={cr => cr}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {customResource.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n {capitalizedName}\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { DefaultCustomResourceDrawer } from './DefaultCustomResourceDrawer';\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\ntype DefaultCustomResourceAccordionsProps = {\n customResources: any[];\n customResourceName: string;\n defaultExpanded?: boolean;\n children?: React.ReactNode;\n};\n\ntype DefaultCustomResourceAccordionProps = {\n customResource: any;\n customResourceName: string;\n defaultExpanded?: boolean;\n children?: React.ReactNode;\n};\n\ntype DefaultCustomResourceSummaryProps = {\n customResource: any;\n customResourceName: string;\n children?: React.ReactNode;\n};\n\nconst DefaultCustomResourceSummary = ({\n customResource,\n customResourceName,\n}: DefaultCustomResourceSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={12} item>\n <DefaultCustomResourceDrawer\n customResource={customResource}\n customResourceName={customResourceName}\n />\n </Grid>\n </Grid>\n );\n};\n\nconst DefaultCustomResourceAccordion = ({\n customResource,\n customResourceName,\n defaultExpanded,\n}: DefaultCustomResourceAccordionProps) => {\n return (\n <Accordion\n defaultExpanded={defaultExpanded}\n TransitionProps={{ unmountOnExit: true }}\n variant=\"outlined\"\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <DefaultCustomResourceSummary\n customResource={customResource}\n customResourceName={customResourceName}\n />\n </AccordionSummary>\n <AccordionDetails>\n {Object.prototype.hasOwnProperty.call(customResource, 'status') && (\n <StructuredMetadataTable metadata={customResource.status} />\n )}\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const DefaultCustomResourceAccordions = ({\n customResources,\n customResourceName,\n defaultExpanded = false,\n}: DefaultCustomResourceAccordionsProps) => {\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {customResources.map((cr, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <DefaultCustomResourceAccordion\n defaultExpanded={defaultExpanded}\n customResource={cr}\n customResourceName={customResourceName}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport lodash, { Dictionary } from 'lodash';\nimport { RolloutAccordions } from './ArgoRollouts';\nimport { DefaultCustomResourceAccordions } from './DefaultCustomResource';\nimport { GroupedResponsesContext } from '../../hooks';\n\n/**\n *\n *\n * @public\n */\nexport interface CustomResourcesProps {\n children?: React.ReactNode;\n}\n\nconst kindToResource = (customResources: any[]): Dictionary<any[]> => {\n return lodash.groupBy(customResources, value => {\n return value.kind;\n });\n};\n\n/**\n *\n *\n * @public\n */\nexport const CustomResources = ({}: CustomResourcesProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n const kindToResourceMap = kindToResource(groupedResponses.customResources);\n\n return (\n <>\n {Object.entries(kindToResourceMap).map(([kind, resources], i) => {\n switch (kind) {\n case 'Rollout':\n return <RolloutAccordions key={i} rollouts={resources} />;\n default:\n return (\n <DefaultCustomResourceAccordions\n key={i}\n customResources={resources}\n customResourceName={kind}\n />\n );\n }\n })}\n </>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport {\n ClientPodStatus,\n ClusterObjects,\n groupResponses,\n} from '@backstage/plugin-kubernetes-common';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { DeploymentsAccordions } from '../DeploymentsAccordions';\nimport { StatefulSetsAccordions } from '../StatefulSetsAccordions';\nimport { IngressesAccordions } from '../IngressesAccordions';\nimport { ServicesAccordions } from '../ServicesAccordions';\nimport { CronJobsAccordions } from '../CronJobsAccordions';\nimport { CustomResources } from '../CustomResources';\nimport {\n ClusterContext,\n GroupedResponsesContext,\n PodNamesWithErrorsContext,\n} from '../../hooks';\n\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { PodMetricsContext } from '../../hooks/usePodMetrics';\n\ntype ClusterSummaryProps = {\n clusterName: string;\n totalNumberOfPods: number;\n numberOfPodsWithErrors: number;\n children?: React.ReactNode;\n};\n\nconst ClusterSummary = ({\n clusterName,\n totalNumberOfPods,\n numberOfPodsWithErrors,\n}: ClusterSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid\n xs={6}\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item xs>\n <Typography variant=\"body1\">{clusterName}</Typography>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Cluster\n </Typography>\n </Grid>\n </Grid>\n <Grid\n item\n container\n xs={3}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{totalNumberOfPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>{numberOfPodsWithErrors} pods with errors</StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\n/**\n * Props for Cluster\n *\n * @public\n */\nexport type ClusterProps = {\n clusterObjects: ClusterObjects;\n podsWithErrors: Set<string>;\n children?: React.ReactNode;\n};\n\n/**\n * Component for rendering Kubernetes resources in a cluster\n *\n * @public\n */\nexport const Cluster = ({ clusterObjects, podsWithErrors }: ClusterProps) => {\n const groupedResponses = groupResponses(clusterObjects.resources);\n\n const podMetricsMap = new Map<string, ClientPodStatus[]>();\n podMetricsMap.set(clusterObjects.cluster.name, clusterObjects.podMetrics);\n return (\n <ClusterContext.Provider value={clusterObjects.cluster}>\n <GroupedResponsesContext.Provider value={groupedResponses}>\n <PodMetricsContext.Provider value={podMetricsMap}>\n <PodNamesWithErrorsContext.Provider value={podsWithErrors}>\n <Accordion TransitionProps={{ unmountOnExit: true }}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <ClusterSummary\n clusterName={clusterObjects.cluster.name}\n totalNumberOfPods={groupedResponses.pods.length}\n numberOfPodsWithErrors={podsWithErrors.size}\n />\n </AccordionSummary>\n <AccordionDetails>\n <Grid container direction=\"column\">\n {groupedResponses.customResources.length > 0 ? (\n <Grid item>\n <CustomResources />\n </Grid>\n ) : undefined}\n {groupedResponses.deployments.length > 0 ? (\n <Grid item>\n <DeploymentsAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.statefulsets.length > 0 ? (\n <Grid item>\n <StatefulSetsAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.ingresses.length > 0 ? (\n <Grid item>\n <IngressesAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.services.length > 0 ? (\n <Grid item>\n <ServicesAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.cronJobs.length > 0 ? (\n <Grid item>\n <CronJobsAccordions />\n </Grid>\n ) : undefined}\n </Grid>\n </AccordionDetails>\n </Accordion>\n </PodNamesWithErrorsContext.Provider>\n </PodMetricsContext.Provider>\n </GroupedResponsesContext.Provider>\n </ClusterContext.Provider>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { Typography } from '@material-ui/core';\nimport { ClusterObjects } from '@backstage/plugin-kubernetes-common';\nimport { WarningPanel } from '@backstage/core-components';\n\nconst clustersWithErrorsToErrorMessage = (\n clustersWithErrors: ClusterObjects[],\n): React.ReactNode => {\n return clustersWithErrors.map((c, i) => {\n return (\n <div key={i}>\n <Typography variant=\"body2\">{`Cluster: ${c.cluster.name}`}</Typography>\n {c.errors.map((e, j) => {\n return (\n <Typography variant=\"body2\" key={j}>\n {e.errorType === 'FETCH_ERROR'\n ? `Error communicating with Kubernetes: ${e.errorType}, message: ${e.message}`\n : `Error fetching Kubernetes resource: '${e.resourcePath}', error: ${e.errorType}, status code: ${e.statusCode}`}\n </Typography>\n );\n })}\n <br />\n </div>\n );\n });\n};\n\n/**\n *\n *\n * @public\n */\nexport type ErrorPanelProps = {\n entityName: string;\n errorMessage?: string;\n clustersWithErrors?: ClusterObjects[];\n children?: React.ReactNode;\n};\n\n/**\n *\n *\n * @public\n */\nexport const ErrorPanel = ({\n entityName,\n errorMessage,\n clustersWithErrors,\n}: ErrorPanelProps) => (\n <WarningPanel\n title=\"There was a problem retrieving Kubernetes objects\"\n message={`There was a problem retrieving some Kubernetes resources for the entity: ${entityName}. This could mean that the Error Reporting card is not completely accurate.`}\n >\n {clustersWithErrors && (\n <div>Errors: {clustersWithErrorsToErrorMessage(clustersWithErrors)}</div>\n )}\n {errorMessage && (\n <Typography variant=\"body2\">Errors: {errorMessage}</Typography>\n )}\n </WarningPanel>\n);\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport * as React from 'react';\nimport {\n DetectedError,\n DetectedErrorsByCluster,\n} from '@backstage/plugin-kubernetes-common';\nimport { Table, TableColumn } from '@backstage/core-components';\n\n/**\n *\n *\n * @public\n */\nexport type ErrorReportingProps = {\n detectedErrors: DetectedErrorsByCluster;\n};\n\nconst columns: TableColumn<Row>[] = [\n {\n title: 'cluster',\n width: '10%',\n render: (row: Row) => row.clusterName,\n },\n {\n title: 'namespace',\n width: '10%',\n render: (row: Row) => row.error.sourceRef.namespace,\n },\n {\n title: 'kind',\n width: '10%',\n render: (row: Row) => row.error.sourceRef.kind,\n },\n {\n title: 'name',\n width: '30%',\n render: (row: Row) => {\n return <>{row.error.sourceRef.name} </>;\n },\n },\n {\n title: 'messages',\n width: '40%',\n render: (row: Row) => row.error.message,\n },\n];\n\ninterface Row {\n clusterName: string;\n error: DetectedError;\n}\n\nconst sortBySeverity = (a: Row, b: Row) => {\n if (a.error.severity < b.error.severity) {\n return 1;\n } else if (b.error.severity < a.error.severity) {\n return -1;\n }\n return 0;\n};\n\n/**\n *\n *\n * @public\n */\nexport const ErrorReporting = ({ detectedErrors }: ErrorReportingProps) => {\n const errors = Array.from(detectedErrors.entries())\n .flatMap(([clusterName, resourceErrors]) => {\n return resourceErrors.map(e => ({\n clusterName,\n error: e,\n }));\n })\n .sort(sortBySeverity);\n\n return (\n <>\n {errors.length !== 0 && (\n <Table\n title=\"Error Reporting\"\n data={errors}\n columns={columns}\n options={{ paging: true, search: false, emptyRowsWhenPaging: false }}\n />\n )}\n </>\n );\n};\n"],"names":["__publicField","React","_a","_b","_c","_d","kindMappings","currentToDeclaredResourceToPerc","useStyles","useDrawerStyles","useDrawerContentStyles","Close","BackstageButton","withStyles","makeStyles","createStyles","Typography","Dialog","DialogTitle","IconButton","DialogContent","_e","_f","containerStatuses"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/hooks/useIsPodExecTerminalEnabled.ts","../src/api/types.ts","../src/hooks/useIsPodExecTerminalSupported.ts","../src/hooks/auth.ts","../src/kubernetes-auth-provider/types.ts","../src/kubernetes-auth-provider/GoogleKubernetesAuthProvider.ts","../src/kubernetes-auth-provider/ServerSideAuthProvider.ts","../src/kubernetes-auth-provider/OidcKubernetesAuthProvider.ts","../src/kubernetes-auth-provider/AksKubernetesAuthProvider.ts","../src/kubernetes-auth-provider/KubernetesAuthProviders.ts","../src/hooks/useKubernetesObjects.ts","../src/hooks/useCustomResources.ts","../src/hooks/PodNamesWithErrors.ts","../src/hooks/PodNamesWithMetrics.ts","../src/hooks/GroupedResponses.ts","../src/hooks/Cluster.ts","../src/hooks/usePodMetrics.ts","../src/hooks/useMatchingErrors.ts","../src/api/KubernetesBackendClient.ts","../src/api/KubernetesClusterLinkFormatter.ts","../src/api/KubernetesProxyClient.ts","../src/api/formatters/AksClusterLinksFormatter.ts","../src/api/formatters/EksClusterLinksFormatter.ts","../src/api/formatters/GkeClusterLinksFormatter.ts","../src/api/formatters/StandardClusterLinksFormatter.ts","../src/api/formatters/OpenshiftClusterLinksFormatter.ts","../src/api/formatters/RancherClusterLinksFormatter.ts","../src/api/formatters/index.ts","../src/utils/resources.ts","../src/components/KubernetesDialog/KubernetesDialog.tsx","../src/components/PodExecTerminal/PodExecTerminalAttachAddon.ts","../src/components/PodExecTerminal/PodExecTerminal.tsx","../src/components/PodExecTerminal/PodExecTerminalDialog.tsx","../src/components/ResourceUtilization/ResourceUtilization.tsx","../src/components/Pods/PodLogs/usePodLogs.ts","../src/components/Pods/PodLogs/PodLogs.tsx","../src/components/Pods/PodLogs/PodLogsDialog.tsx","../src/components/Pods/PodDrawer/ContainerCard.tsx","../src/components/KubernetesDrawer/ManifestYaml.tsx","../src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx","../src/components/KubernetesDrawer/KubernetesDrawer.tsx","../src/components/Pods/PodDrawer/PendingPodContent.tsx","../src/components/Pods/Events/useEvents.ts","../src/components/Pods/Events/Events.tsx","../src/components/Pods/FixDialog/FixDialog.tsx","../src/components/Pods/ErrorList/ErrorList.tsx","../src/components/Pods/PodDrawer/PodDrawer.tsx","../src/utils/pod.tsx","../src/components/Pods/PodsTable.tsx","../src/components/DeploymentsAccordions/DeploymentDrawer.tsx","../src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx","../src/utils/owner.ts","../src/components/DeploymentsAccordions/DeploymentsAccordions.tsx","../src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx","../src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx","../src/components/IngressesAccordions/IngressDrawer.tsx","../src/components/IngressesAccordions/IngressesAccordions.tsx","../src/components/ServicesAccordions/ServiceDrawer.tsx","../src/components/ServicesAccordions/ServicesAccordions.tsx","../src/components/JobsAccordions/JobsDrawer.tsx","../src/components/JobsAccordions/JobsAccordions.tsx","../src/components/CronJobsAccordions/CronJobsDrawer.tsx","../src/utils/crons.ts","../src/components/CronJobsAccordions/CronJobsAccordions.tsx","../src/components/CustomResources/ArgoRollouts/RolloutDrawer.tsx","../src/components/CustomResources/ArgoRollouts/StepsProgress.tsx","../src/components/CustomResources/ArgoRollouts/Rollout.tsx","../src/components/CustomResources/DefaultCustomResourceDrawer.tsx","../src/components/CustomResources/DefaultCustomResource.tsx","../src/components/CustomResources/CustomResources.tsx","../src/components/Cluster/Cluster.tsx","../src/components/ErrorPanel/ErrorPanel.tsx","../src/components/ErrorReporting/ErrorReporting.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\n\n/**\n * Check if conditions for a pod exec call through the proxy endpoint are met\n *\n * @internal\n */\nexport const useIsPodExecTerminalEnabled = (): boolean | undefined => {\n const configApi = useApi(configApiRef);\n\n return configApi.getOptionalBoolean('kubernetes.podExecTerminal.enabled');\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n KubernetesRequestBody,\n ObjectsByEntityResponse,\n WorkloadsByEntityRequest,\n CustomObjectsByEntityRequest,\n} from '@backstage/plugin-kubernetes-common';\nimport { createApiRef } from '@backstage/core-plugin-api';\nimport { Event } from 'kubernetes-models/v1';\nimport { JsonObject } from '@backstage/types';\n\n/** @public */\nexport const kubernetesApiRef = createApiRef<KubernetesApi>({\n id: 'plugin.kubernetes.service',\n});\n\n/** @public */\nexport const kubernetesProxyApiRef = createApiRef<KubernetesProxyApi>({\n id: 'plugin.kubernetes.proxy-service',\n});\n\n/** @public */\nexport const kubernetesClusterLinkFormatterApiRef =\n createApiRef<KubernetesClusterLinkFormatterApi>({\n id: 'plugin.kubernetes.cluster-link-formatter-service',\n });\n\n/** @public */\nexport interface KubernetesApi {\n getObjectsByEntity(\n requestBody: KubernetesRequestBody,\n ): Promise<ObjectsByEntityResponse>;\n getClusters(): Promise<\n {\n name: string;\n authProvider: string;\n oidcTokenProvider?: string;\n }[]\n >;\n getCluster(clusterName: string): Promise<\n | {\n name: string;\n authProvider: string;\n oidcTokenProvider?: string;\n dashboardUrl?: string;\n }\n | undefined\n >;\n getWorkloadsByEntity(\n request: WorkloadsByEntityRequest,\n ): Promise<ObjectsByEntityResponse>;\n getCustomObjectsByEntity(\n request: CustomObjectsByEntityRequest,\n ): Promise<ObjectsByEntityResponse>;\n proxy(options: {\n clusterName: string;\n path: string;\n init?: RequestInit;\n }): Promise<Response>;\n}\n\n/** @public */\nexport interface KubernetesProxyApi {\n getPodLogs(request: {\n podName: string;\n namespace: string;\n clusterName: string;\n containerName: string;\n previous?: boolean;\n }): Promise<{ text: string }>;\n getEventsByInvolvedObjectName(request: {\n clusterName: string;\n involvedObjectName: string;\n namespace: string;\n }): Promise<Event[]>;\n}\n\n/**\n * @public\n */\nexport type FormatClusterLinkOptions = {\n dashboardUrl?: string;\n dashboardApp?: string;\n dashboardParameters?: JsonObject;\n object: any;\n kind: string;\n};\n\n/** @public */\nexport interface KubernetesClusterLinkFormatterApi {\n formatClusterLink(\n options: FormatClusterLinkOptions,\n ): Promise<string | undefined>;\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync, { AsyncState } from 'react-use/lib/useAsync';\n\nimport { kubernetesApiRef } from '../api/types';\n\n/**\n * Check if conditions for a pod exec call through the proxy endpoint are met\n *\n * @internal\n */\nexport const useIsPodExecTerminalSupported = (): AsyncState<boolean> => {\n const kubernetesApi = useApi(kubernetesApiRef);\n\n return useAsync(async () => {\n const clusters = await kubernetesApi.getClusters();\n\n if (clusters.length !== 1) {\n return false;\n }\n\n const { authProvider } = clusters[0];\n const isClientAuthProvider = ['aks', 'google', 'oidc'].some(\n authProviderName => authProvider.includes(authProviderName),\n );\n\n return !isClientAuthProvider;\n });\n};\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { KubernetesAuthProvidersApi } from '../kubernetes-auth-provider';\nimport { KubernetesApi } from '../api/types';\n\nexport const generateAuth = async (\n entity: Entity,\n kubernetesApi: KubernetesApi,\n kubernetesAuthProvidersApi: KubernetesAuthProvidersApi,\n) => {\n const clusters = await kubernetesApi.getClusters();\n\n const authProviders: string[] = [\n ...new Set(\n clusters.map(\n c =>\n `${c.authProvider}${\n c.oidcTokenProvider ? `.${c.oidcTokenProvider}` : ''\n }`,\n ),\n ),\n ];\n\n let requestBody: KubernetesRequestBody = {\n entity,\n };\n for (const authProviderStr of authProviders) {\n requestBody = await kubernetesAuthProvidersApi.decorateRequestBodyForAuth(\n authProviderStr,\n requestBody,\n );\n }\n return requestBody.auth ?? {};\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { createApiRef } from '@backstage/core-plugin-api';\n\n/** @public */\nexport interface KubernetesAuthProvider {\n decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody>;\n getCredentials(): Promise<{ token?: string }>;\n}\n\n/** @public */\nexport const kubernetesAuthProvidersApiRef =\n createApiRef<KubernetesAuthProvidersApi>({\n id: 'plugin.kubernetes-auth-providers.service',\n });\n\n/** @public */\nexport interface KubernetesAuthProvidersApi {\n decorateRequestBodyForAuth(\n authProvider: string,\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody>;\n getCredentials(authProvider: string): Promise<{ token?: string }>;\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesAuthProvider } from './types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { OAuthApi } from '@backstage/core-plugin-api';\n\n/** @public */\nexport class GoogleKubernetesAuthProvider implements KubernetesAuthProvider {\n authProvider: OAuthApi;\n\n constructor(authProvider: OAuthApi) {\n this.authProvider = authProvider;\n }\n\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n const googleAuthToken: string = (await this.getCredentials()).token;\n if ('auth' in requestBody) {\n requestBody.auth!.google = googleAuthToken;\n } else {\n requestBody.auth = { google: googleAuthToken };\n }\n return requestBody;\n }\n async getCredentials(): Promise<{ token: string }> {\n return {\n token: await this.authProvider.getAccessToken(\n 'https://www.googleapis.com/auth/cloud-platform.read-only',\n ),\n };\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesAuthProvider } from './types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\n\n/**\n * No-op KubernetesAuthProvider, authorization will be handled in the kubernetes-backend plugin\n *\n * @public\n */\nexport class ServerSideKubernetesAuthProvider\n implements KubernetesAuthProvider\n{\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n // No-op, auth will be taken care of on the server-side\n return requestBody;\n }\n\n async getCredentials(): Promise<{}> {\n return {};\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { JsonObject } from '@backstage/types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { OpenIdConnectApi } from '@backstage/core-plugin-api';\nimport { KubernetesAuthProvider } from './types';\n\n/** @public */\nexport class OidcKubernetesAuthProvider implements KubernetesAuthProvider {\n providerName: string;\n authProvider: OpenIdConnectApi;\n\n constructor(providerName: string, authProvider: OpenIdConnectApi) {\n this.providerName = providerName;\n this.authProvider = authProvider;\n }\n\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n const authToken: string = (await this.getCredentials()).token;\n const auth = { ...(requestBody.auth as JsonObject) };\n if (auth.oidc) {\n (auth.oidc as JsonObject)[this.providerName] = authToken;\n } else {\n auth.oidc = { [this.providerName]: authToken };\n }\n requestBody.auth = auth;\n return requestBody;\n }\n\n async getCredentials(): Promise<{ token: string }> {\n return {\n token: await this.authProvider.getIdToken(),\n };\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { OAuthApi } from '@backstage/core-plugin-api';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { KubernetesAuthProvider } from './types';\n\n/** @public */\nexport class AksKubernetesAuthProvider implements KubernetesAuthProvider {\n constructor(private readonly microsoftAuthApi: OAuthApi) {}\n\n async decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n return {\n ...requestBody,\n auth: { ...requestBody.auth, aks: (await this.getCredentials()).token },\n };\n }\n\n async getCredentials(): Promise<{ token?: string }> {\n return {\n token: await this.microsoftAuthApi.getAccessToken(\n '6dae42f8-4368-4678-94ff-3960e28e3630/user.read',\n ),\n };\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { KubernetesAuthProvider, KubernetesAuthProvidersApi } from './types';\nimport { GoogleKubernetesAuthProvider } from './GoogleKubernetesAuthProvider';\nimport { ServerSideKubernetesAuthProvider } from './ServerSideAuthProvider';\nimport { OAuthApi, OpenIdConnectApi } from '@backstage/core-plugin-api';\nimport { OidcKubernetesAuthProvider } from './OidcKubernetesAuthProvider';\nimport { AksKubernetesAuthProvider } from './AksKubernetesAuthProvider';\n\n/** @public */\nexport class KubernetesAuthProviders implements KubernetesAuthProvidersApi {\n private readonly kubernetesAuthProviderMap: Map<\n string,\n KubernetesAuthProvider\n >;\n\n constructor(options: {\n microsoftAuthApi: OAuthApi;\n googleAuthApi: OAuthApi;\n oidcProviders?: { [key: string]: OpenIdConnectApi };\n }) {\n this.kubernetesAuthProviderMap = new Map<string, KubernetesAuthProvider>();\n this.kubernetesAuthProviderMap.set(\n 'google',\n new GoogleKubernetesAuthProvider(options.googleAuthApi),\n );\n this.kubernetesAuthProviderMap.set(\n 'serviceAccount',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'googleServiceAccount',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'aws',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'azure',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'localKubectlProxy',\n new ServerSideKubernetesAuthProvider(),\n );\n this.kubernetesAuthProviderMap.set(\n 'aks',\n new AksKubernetesAuthProvider(options.microsoftAuthApi),\n );\n\n if (options.oidcProviders) {\n Object.keys(options.oidcProviders).forEach(provider => {\n this.kubernetesAuthProviderMap.set(\n `oidc.${provider}`,\n new OidcKubernetesAuthProvider(\n provider,\n options.oidcProviders![provider],\n ),\n );\n });\n }\n }\n\n async decorateRequestBodyForAuth(\n authProvider: string,\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody> {\n const kubernetesAuthProvider: KubernetesAuthProvider | undefined =\n this.kubernetesAuthProviderMap.get(authProvider);\n if (kubernetesAuthProvider) {\n return await kubernetesAuthProvider.decorateRequestBodyForAuth(\n requestBody,\n );\n }\n\n if (authProvider.startsWith('oidc.')) {\n throw new Error(\n `KubernetesAuthProviders has no oidcProvider configured for ${authProvider}`,\n );\n }\n throw new Error(\n `authProvider \"${authProvider}\" has no KubernetesAuthProvider defined for it`,\n );\n }\n\n async getCredentials(authProvider: string): Promise<{ token?: string }> {\n const kubernetesAuthProvider: KubernetesAuthProvider | undefined =\n this.kubernetesAuthProviderMap.get(authProvider);\n\n if (kubernetesAuthProvider) {\n return await kubernetesAuthProvider.getCredentials();\n }\n\n if (authProvider.startsWith('oidc.')) {\n throw new Error(\n `KubernetesAuthProviders has no oidcProvider configured for ${authProvider}`,\n );\n }\n throw new Error(\n `authProvider \"${authProvider}\" has no KubernetesAuthProvider defined for it`,\n );\n }\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { useCallback } from 'react';\nimport useInterval from 'react-use/lib/useInterval';\nimport { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { generateAuth } from './auth';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider';\nimport { kubernetesApiRef } from '../api/types';\n\n/**\n *\n * @public\n */\nexport interface KubernetesObjects {\n kubernetesObjects?: ObjectsByEntityResponse;\n loading: boolean;\n error?: string;\n}\n\n/**\n *\n * @public\n */\nexport const useKubernetesObjects = (\n entity: Entity,\n intervalMs: number = 10000,\n): KubernetesObjects => {\n const kubernetesApi = useApi(kubernetesApiRef);\n const kubernetesAuthProvidersApi = useApi(kubernetesAuthProvidersApiRef);\n const getObjects = useCallback(async (): Promise<ObjectsByEntityResponse> => {\n const auth = await generateAuth(\n entity,\n kubernetesApi,\n kubernetesAuthProvidersApi,\n );\n return await kubernetesApi.getObjectsByEntity({\n auth,\n entity,\n });\n }, [kubernetesApi, entity, kubernetesAuthProvidersApi]);\n\n const { value, loading, error, retry } = useAsyncRetry(\n () => getObjects(),\n [getObjects],\n );\n\n useInterval(() => retry(), intervalMs);\n\n return {\n kubernetesObjects: value,\n loading,\n error: error?.message,\n };\n};\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { useCallback } from 'react';\nimport useInterval from 'react-use/lib/useInterval';\nimport {\n CustomResourceMatcher,\n ObjectsByEntityResponse,\n} from '@backstage/plugin-kubernetes-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { KubernetesObjects } from './useKubernetesObjects';\nimport { generateAuth } from './auth';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider';\nimport { kubernetesApiRef } from '../api/types';\n\n/**\n * Retrieves the provided custom resources related to the provided entity, refreshes at an interval.\n *\n * @public\n */\nexport const useCustomResources = (\n entity: Entity,\n customResourceMatchers: CustomResourceMatcher[],\n intervalMs: number = 10000,\n): KubernetesObjects => {\n const kubernetesApi = useApi(kubernetesApiRef);\n const kubernetesAuthProvidersApi = useApi(kubernetesAuthProvidersApiRef);\n const matchersString = JSON.stringify(customResourceMatchers);\n const getCustomObjects = useCallback(\n async (): Promise<ObjectsByEntityResponse> => {\n const auth = await generateAuth(\n entity,\n kubernetesApi,\n kubernetesAuthProvidersApi,\n );\n return await kubernetesApi.getCustomObjectsByEntity({\n auth,\n customResources: customResourceMatchers,\n entity,\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [kubernetesApi, entity, kubernetesAuthProvidersApi, matchersString],\n );\n\n const { value, loading, error, retry } = useAsyncRetry(\n () => getCustomObjects(),\n [getCustomObjects],\n );\n\n useInterval(() => retry(), intervalMs);\n\n return {\n kubernetesObjects: value,\n loading,\n error: error?.message,\n };\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\n/**\n * @public\n */\nexport const PodNamesWithErrorsContext = React.createContext<Set<string>>(\n new Set<string>(),\n);\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { ClientPodStatus } from '@backstage/plugin-kubernetes-common';\n\n/**\n * @public\n */\nexport const PodNamesWithMetricsContext = React.createContext<\n Map<string, ClientPodStatus>\n>(new Map<string, ClientPodStatus>());\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { GroupedResponses } from '@backstage/plugin-kubernetes-common';\n\n/**\n *\n *\n * @public\n */\nexport const GroupedResponsesContext = React.createContext<GroupedResponses>({\n pods: [],\n replicaSets: [],\n deployments: [],\n services: [],\n configMaps: [],\n horizontalPodAutoscalers: [],\n ingresses: [],\n jobs: [],\n cronJobs: [],\n customResources: [],\n statefulsets: [],\n});\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\n\n/**\n * @public\n */\nexport const ClusterContext = React.createContext<ClusterAttributes>({\n name: '',\n});\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta';\nimport { ClientPodStatus } from '@backstage/plugin-kubernetes-common';\n\n/**\n * Context for Pod Metrics\n *\n * @public\n */\nexport const PodMetricsContext = React.createContext<\n Map<string, ClientPodStatus[]>\n>(new Map());\n\n/**\n * @public\n */\nexport type PodMetricsMatcher = {\n metadata?: IObjectMeta;\n};\n\n/**\n * Find metrics matching the provided pod\n *\n * @public\n */\nexport const usePodMetrics = (\n clusterName: string,\n matcher: PodMetricsMatcher,\n): ClientPodStatus | undefined => {\n const targetRef = {\n name: matcher.metadata?.name ?? '',\n namespace: matcher.metadata?.namespace ?? '',\n };\n\n const metricsMap = useContext(PodMetricsContext);\n\n const metrics = metricsMap.get(clusterName);\n\n return metrics?.find(m => {\n const pod = m.pod;\n return (\n targetRef.name === (pod.metadata?.name ?? '') &&\n targetRef.namespace === (pod.metadata?.namespace ?? '')\n );\n });\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport {\n DetectedError,\n ResourceRef,\n} from '@backstage/plugin-kubernetes-common';\nimport { TypeMeta } from '@kubernetes-models/base';\nimport { IIoK8sApimachineryPkgApisMetaV1ObjectMeta as V1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta';\n\n/**\n * Context for detected errors\n *\n * @public\n */\nexport const DetectedErrorsContext = React.createContext<DetectedError[]>([]);\n\n/**\n *\n * @public\n */\nexport type ErrorMatcher = {\n metadata?: V1ObjectMeta;\n} & TypeMeta;\n\n/**\n * Find errors which match the resource\n *\n * @public\n */\nexport const useMatchingErrors = (matcher: ErrorMatcher): DetectedError[] => {\n const targetRef: ResourceRef = {\n name: matcher.metadata?.name ?? '',\n namespace: matcher.metadata?.namespace ?? '',\n kind: matcher.kind,\n apiGroup: matcher.apiVersion,\n };\n\n const errors = useContext(DetectedErrorsContext);\n\n return errors.filter(e => {\n const r = e.sourceRef;\n return (\n targetRef.apiGroup === r.apiGroup &&\n targetRef.kind === r.kind &&\n targetRef.name === r.name &&\n targetRef.namespace === r.namespace\n );\n });\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { KubernetesApi } from './types';\nimport {\n KubernetesRequestBody,\n ObjectsByEntityResponse,\n WorkloadsByEntityRequest,\n CustomObjectsByEntityRequest,\n} from '@backstage/plugin-kubernetes-common';\nimport { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { KubernetesAuthProvidersApi } from '../kubernetes-auth-provider';\nimport { NotFoundError } from '@backstage/errors';\n\n/** @public */\nexport class KubernetesBackendClient implements KubernetesApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly identityApi: IdentityApi;\n private readonly kubernetesAuthProvidersApi: KubernetesAuthProvidersApi;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n identityApi: IdentityApi;\n kubernetesAuthProvidersApi: KubernetesAuthProvidersApi;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.identityApi = options.identityApi;\n this.kubernetesAuthProvidersApi = options.kubernetesAuthProvidersApi;\n }\n\n private async handleResponse(response: Response): Promise<any> {\n if (!response.ok) {\n const payload = await response.text();\n let message;\n switch (response.status) {\n case 404:\n message =\n 'Could not find the Kubernetes Backend (HTTP 404). Make sure the plugin has been fully installed.';\n break;\n default:\n message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;\n }\n throw new Error(message);\n }\n\n return await response.json();\n }\n\n private async postRequired(path: string, requestBody: any): Promise<any> {\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}${path}`;\n const { token: idToken } = await this.identityApi.getCredentials();\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n body: JSON.stringify(requestBody),\n });\n\n return this.handleResponse(response);\n }\n\n public async getCluster(clusterName: string): Promise<{\n name: string;\n authProvider: string;\n oidcTokenProvider?: string;\n }> {\n const cluster = await this.getClusters().then(clusters =>\n clusters.find(c => c.name === clusterName),\n );\n if (!cluster) {\n throw new NotFoundError(`Cluster ${clusterName} not found`);\n }\n\n return cluster;\n }\n\n private async getCredentials(\n authProvider: string,\n oidcTokenProvider?: string,\n ): Promise<{ token?: string }> {\n return await this.kubernetesAuthProvidersApi.getCredentials(\n authProvider === 'oidc'\n ? `${authProvider}.${oidcTokenProvider}`\n : authProvider,\n );\n }\n\n async getObjectsByEntity(\n requestBody: KubernetesRequestBody,\n ): Promise<ObjectsByEntityResponse> {\n return await this.postRequired(\n `/services/${requestBody.entity.metadata.name}`,\n requestBody,\n );\n }\n\n async getWorkloadsByEntity(\n request: WorkloadsByEntityRequest,\n ): Promise<ObjectsByEntityResponse> {\n return await this.postRequired('/resources/workloads/query', {\n auth: request.auth,\n entityRef: stringifyEntityRef(request.entity),\n });\n }\n\n async getCustomObjectsByEntity(\n request: CustomObjectsByEntityRequest,\n ): Promise<ObjectsByEntityResponse> {\n return await this.postRequired(`/resources/custom/query`, {\n entityRef: stringifyEntityRef(request.entity),\n auth: request.auth,\n customResources: request.customResources,\n });\n }\n\n async getClusters(): Promise<{ name: string; authProvider: string }[]> {\n const { token: idToken } = await this.identityApi.getCredentials();\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}/clusters`;\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n ...(idToken && { Authorization: `Bearer ${idToken}` }),\n },\n });\n\n return (await this.handleResponse(response)).items;\n }\n\n async proxy(options: {\n clusterName: string;\n path: string;\n init?: RequestInit;\n }): Promise<Response> {\n const { authProvider, oidcTokenProvider } = await this.getCluster(\n options.clusterName,\n );\n const kubernetesCredentials = await this.getCredentials(\n authProvider,\n oidcTokenProvider,\n );\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}/proxy${\n options.path\n }`;\n const identityResponse = await this.identityApi.getCredentials();\n const headers = KubernetesBackendClient.getKubernetesHeaders(\n options,\n kubernetesCredentials?.token,\n identityResponse,\n authProvider,\n oidcTokenProvider,\n );\n return await fetch(url, { ...options.init, headers });\n }\n\n private static getKubernetesHeaders(\n options: {\n clusterName: string;\n path: string;\n init?: RequestInit;\n },\n k8sToken: string | undefined,\n identityResponse: { token?: string },\n authProvider: string,\n oidcTokenProvider: string | undefined,\n ) {\n const kubernetesAuthHeader =\n KubernetesBackendClient.getKubernetesAuthHeaderByAuthProvider(\n authProvider,\n oidcTokenProvider,\n );\n return {\n ...options.init?.headers,\n [`Backstage-Kubernetes-Cluster`]: options.clusterName,\n ...(k8sToken && {\n [kubernetesAuthHeader]: k8sToken,\n }),\n ...(identityResponse.token && {\n Authorization: `Bearer ${identityResponse.token}`,\n }),\n };\n }\n\n private static getKubernetesAuthHeaderByAuthProvider(\n authProvider: string,\n oidcTokenProvider: string | undefined,\n ): string {\n let header: string = 'Backstage-Kubernetes-Authorization';\n\n header = header.concat('-', authProvider);\n\n if (oidcTokenProvider) header = header.concat('-', oidcTokenProvider);\n\n return header;\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n KubernetesClusterLinkFormatterApi,\n FormatClusterLinkOptions,\n} from './types';\nimport { ClusterLinksFormatter } from '../types';\n\n/** @public */\nexport class KubernetesClusterLinkFormatter\n implements KubernetesClusterLinkFormatterApi\n{\n private readonly formatters: Record<string, ClusterLinksFormatter>;\n private readonly defaultFormatterName: string;\n\n constructor(options: {\n formatters: Record<string, ClusterLinksFormatter>;\n defaultFormatterName: string;\n }) {\n this.formatters = options.formatters;\n this.defaultFormatterName = options.defaultFormatterName;\n }\n async formatClusterLink(options: FormatClusterLinkOptions) {\n if (!options.dashboardUrl && !options.dashboardParameters) {\n return undefined;\n }\n if (options.dashboardUrl && !options.object) {\n return options.dashboardUrl;\n }\n const app = options.dashboardApp ?? this.defaultFormatterName;\n const formatter = this.formatters[app];\n if (!formatter) {\n throw new Error(`Could not find Kubernetes dashboard app named '${app}'`);\n }\n const url = await formatter.formatClusterLink({\n dashboardUrl: options.dashboardUrl\n ? new URL(options.dashboardUrl)\n : undefined,\n dashboardParameters: options.dashboardParameters,\n object: options.object,\n kind: options.kind,\n });\n return url.toString();\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { KubernetesApi } from './types';\nimport { Event } from 'kubernetes-models/v1';\n\n/**\n * A client for common requests through the proxy endpoint of the kubernetes backend plugin.\n *\n * @public\n */\nexport class KubernetesProxyClient {\n private readonly kubernetesApi: KubernetesApi;\n\n constructor(options: { kubernetesApi: KubernetesApi }) {\n this.kubernetesApi = options.kubernetesApi;\n }\n\n private async handleText(response: Response): Promise<string> {\n if (!response.ok) {\n const payload = await response.text();\n let message;\n switch (response.status) {\n default:\n message = `Proxy request failed with ${response.status} ${response.statusText}, ${payload}`;\n }\n throw new Error(message);\n }\n\n return await response.text();\n }\n\n private async handleJson(response: Response): Promise<any> {\n if (!response.ok) {\n const payload = await response.text();\n let message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;\n switch (response.status) {\n case 404:\n message = `Proxy request failed with ${response.status} ${response.statusText}, ${payload}`;\n break;\n default:\n message = `Request failed with ${response.status} ${response.statusText}, ${payload}`;\n }\n throw new Error(message);\n }\n\n return await response.json();\n }\n\n async getEventsByInvolvedObjectName({\n clusterName,\n involvedObjectName,\n namespace,\n }: {\n clusterName: string;\n involvedObjectName: string;\n namespace: string;\n }): Promise<Event[]> {\n return await this.kubernetesApi\n .proxy({\n clusterName,\n path: `/api/v1/namespaces/${namespace}/events?fieldSelector=involvedObject.name=${involvedObjectName}`,\n init: {\n method: 'GET',\n },\n })\n .then(response => this.handleJson(response))\n .then(eventList => eventList.items);\n }\n\n async getPodLogs({\n podName,\n namespace,\n clusterName,\n containerName,\n previous,\n }: {\n podName: string;\n namespace: string;\n clusterName: string;\n containerName: string;\n previous?: boolean;\n }): Promise<{ text: string }> {\n const params = new URLSearchParams({\n container: containerName,\n });\n if (previous) {\n params.append('previous', '');\n }\n return await this.kubernetesApi\n .proxy({\n clusterName: clusterName,\n path: `/api/v1/namespaces/${namespace}/pods/${podName}/log?${params.toString()}`,\n init: {\n method: 'GET',\n },\n })\n .then(response => this.handleText(response))\n .then(text => ({ text }));\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ClusterLinksFormatter,\n ClusterLinksFormatterOptions,\n} from '../../types';\n\nconst basePath =\n 'https://portal.azure.com/#blade/Microsoft_Azure_ContainerService/AksK8ResourceMenuBlade/overview-Deployment/aksClusterId';\n\nconst requiredParams = ['subscriptionId', 'resourceGroup', 'clusterName'];\n\n/** @public */\nexport class AksClusterLinksFormatter implements ClusterLinksFormatter {\n async formatClusterLink(options: ClusterLinksFormatterOptions) {\n if (!options.dashboardParameters) {\n throw new Error('AKS dashboard requires a dashboardParameters option');\n }\n const args = options.dashboardParameters;\n for (const param of requiredParams) {\n if (typeof args[param] !== 'string') {\n throw new Error(\n `AKS dashboard requires a \"${param}\" of type string in the dashboardParameters option`,\n );\n }\n }\n\n const path = `/subscriptions/${args.subscriptionId}/resourceGroups/${args.resourceGroup}/providers/Microsoft.ContainerService/managedClusters/${args.clusterName}`;\n\n const { name, namespace, uid } = options.object.metadata;\n const { selector } = options.object.spec;\n const params = {\n kind: options.kind,\n metadata: { name, namespace, uid },\n spec: {\n selector,\n },\n };\n\n return new URL(\n `${basePath}/${encodeURIComponent(path)}/resource/${encodeURIComponent(\n JSON.stringify(params),\n )}`,\n );\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ClusterLinksFormatter,\n ClusterLinksFormatterOptions,\n} from '../../types';\n\n/** @public */\nexport class EksClusterLinksFormatter implements ClusterLinksFormatter {\n async formatClusterLink(\n _options: ClusterLinksFormatterOptions,\n ): Promise<URL> {\n throw new Error(\n 'EKS formatter is not yet implemented. Please, contribute!',\n );\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ClusterLinksFormatter,\n ClusterLinksFormatterOptions,\n} from '../../types';\nimport { ProfileInfoApi } from '@backstage/core-plugin-api';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployment',\n pod: 'pod',\n ingress: 'ingress',\n service: 'service',\n horizontalpodautoscaler: 'deployment',\n};\n\n/** @public */\nexport class GkeClusterLinksFormatter implements ClusterLinksFormatter {\n constructor(private readonly googleAuthApi: ProfileInfoApi | undefined) {}\n async formatClusterLink(options: ClusterLinksFormatterOptions): Promise<URL> {\n if (!options.dashboardParameters) {\n throw new Error('GKE dashboard requires a dashboardParameters option');\n }\n const args = options.dashboardParameters;\n if (typeof args.projectId !== 'string') {\n throw new Error(\n 'GKE dashboard requires a \"projectId\" of type string in the dashboardParameters option',\n );\n }\n if (typeof args.region !== 'string') {\n throw new Error(\n 'GKE dashboard requires a \"region\" of type string in the dashboardParameters option',\n );\n }\n if (typeof args.clusterName !== 'string') {\n throw new Error(\n 'GKE dashboard requires a \"clusterName\" of type string in the dashboardParameters option',\n );\n }\n const basePath = new URL('https://console.cloud.google.com/');\n const region = encodeURIComponent(args.region);\n const clusterName = encodeURIComponent(args.clusterName);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n let path: string;\n if (namespace && name && validKind) {\n const kindsWithDetails = ['ingress', 'pod'];\n const landingPage = kindsWithDetails.includes(validKind)\n ? 'details'\n : 'overview';\n path = `kubernetes/${validKind}/${region}/${clusterName}/${namespace}/${name}/${landingPage}`;\n } else {\n path = `kubernetes/clusters/details/${region}/${clusterName}/details`;\n }\n const result = new URL(path, basePath);\n result.searchParams.set('project', args.projectId);\n if (this.googleAuthApi) {\n const profile = await this.googleAuthApi.getProfile({ optional: true });\n if (profile?.email) {\n result.searchParams.set('authuser', profile.email);\n }\n }\n return result;\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ClusterLinksFormatter,\n ClusterLinksFormatterOptions,\n} from '../../types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployment',\n pod: 'pod',\n ingress: 'ingress',\n service: 'service',\n horizontalpodautoscaler: 'deployment',\n statefulset: 'statefulset',\n};\n\n/** @public */\nexport class StandardClusterLinksFormatter implements ClusterLinksFormatter {\n async formatClusterLink(options: ClusterLinksFormatterOptions): Promise<URL> {\n if (!options.dashboardUrl) {\n throw new Error('standard dashboard requires a dashboardUrl option');\n }\n const result = new URL(options.dashboardUrl.href);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n if (!result.pathname.endsWith('/')) {\n result.pathname += '/';\n }\n if (validKind && name && namespace) {\n result.hash = `/${validKind}/${namespace}/${name}`;\n } else if (namespace) {\n result.hash = '/workloads';\n }\n if (namespace) {\n // Note that Angular SPA requires a hash and the query parameter should be part of it\n result.hash += `?namespace=${namespace}`;\n }\n return result;\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ClusterLinksFormatterOptions } from '../../types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployments',\n ingress: 'ingresses',\n service: 'services',\n horizontalpodautoscaler: 'horizontalpodautoscalers',\n persistentvolume: 'persistentvolumes',\n};\n\n/** @public */\nexport class OpenshiftClusterLinksFormatter {\n async formatClusterLink(options: ClusterLinksFormatterOptions): Promise<URL> {\n if (!options.dashboardUrl) {\n throw new Error('OpenShift dashboard requires a dashboardUrl option');\n }\n const basePath = new URL(options.dashboardUrl.href);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n if (!basePath.pathname.endsWith('/')) {\n // a dashboard url with a path should end with a slash otherwise\n // the new combined URL will replace the last segment with the appended path!\n // https://foobar.com/abc/def + k8s/cluster/projects/test --> https://foobar.com/abc/k8s/cluster/projects/test\n // https://foobar.com/abc/def/ + k8s/cluster/projects/test --> https://foobar.com/abc/def/k8s/cluster/projects/test\n basePath.pathname += '/';\n }\n let path = '';\n if (namespace) {\n if (name && validKind) {\n path = `k8s/ns/${namespace}/${validKind}/${name}`;\n } else {\n path = `k8s/cluster/projects/${namespace}`;\n }\n } else if (validKind) {\n path = `k8s/cluster/${validKind}`;\n if (name) {\n path += `/${name}`;\n }\n }\n return new URL(path, basePath);\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ClusterLinksFormatter,\n ClusterLinksFormatterOptions,\n} from '../../types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'apps.deployment',\n ingress: 'networking.k8s.io.ingress',\n service: 'service',\n horizontalpodautoscaler: 'autoscaling.horizontalpodautoscaler',\n};\n\n/** @public */\nexport class RancherClusterLinksFormatter implements ClusterLinksFormatter {\n async formatClusterLink(options: ClusterLinksFormatterOptions): Promise<URL> {\n if (!options.dashboardUrl) {\n throw new Error('Rancher dashboard requires a dashboardUrl option');\n }\n const basePath = new URL(options.dashboardUrl.href);\n const name = encodeURIComponent(options.object.metadata?.name ?? '');\n const namespace = encodeURIComponent(\n options.object.metadata?.namespace ?? '',\n );\n const validKind = kindMappings[options.kind.toLocaleLowerCase('en-US')];\n if (!basePath.pathname.endsWith('/')) {\n // a dashboard url with a path should end with a slash otherwise\n // the new combined URL will replace the last segment with the appended path!\n // https://foobar.com/abc/def + explorer/service/test --> https://foobar.com/abc/explorer/service/test\n // https://foobar.com/abc/def/ + explorer/service/test --> https://foobar.com/abc/def/explorer/service/test\n basePath.pathname += '/';\n }\n let path = '';\n if (validKind && name && namespace) {\n path = `explorer/${validKind}/${namespace}/${name}`;\n } else if (namespace) {\n path = 'explorer/workload';\n }\n return new URL(path, basePath);\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AksClusterLinksFormatter } from './AksClusterLinksFormatter';\nimport { ClusterLinksFormatter } from '../../types';\nimport { EksClusterLinksFormatter } from './EksClusterLinksFormatter';\nimport { GkeClusterLinksFormatter } from './GkeClusterLinksFormatter';\nimport { StandardClusterLinksFormatter } from './StandardClusterLinksFormatter';\nimport { OpenshiftClusterLinksFormatter } from './OpenshiftClusterLinksFormatter';\nimport { RancherClusterLinksFormatter } from './RancherClusterLinksFormatter';\nimport { ProfileInfoApi } from '@backstage/core-plugin-api';\n\nexport {\n StandardClusterLinksFormatter,\n AksClusterLinksFormatter,\n EksClusterLinksFormatter,\n GkeClusterLinksFormatter,\n OpenshiftClusterLinksFormatter,\n RancherClusterLinksFormatter,\n};\n\n/** @public */\nexport const DEFAULT_FORMATTER_NAME = 'standard';\n\n/** @public */\nexport function getDefaultFormatters(deps: {\n googleAuthApi: ProfileInfoApi;\n}): Record<string, ClusterLinksFormatter> {\n return {\n standard: new StandardClusterLinksFormatter(),\n aks: new AksClusterLinksFormatter(),\n eks: new EksClusterLinksFormatter(),\n gke: new GkeClusterLinksFormatter(deps.googleAuthApi),\n openshift: new OpenshiftClusterLinksFormatter(),\n rancher: new RancherClusterLinksFormatter(),\n };\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport const currentToDeclaredResourceToPerc = (\n current: number | string,\n resource: number | string,\n): number => {\n if (Number(resource) === 0) return 0;\n\n if (typeof current === 'number' && typeof resource === 'number') {\n return Math.round((current / resource) * 100);\n }\n\n const numerator: bigint = BigInt(current);\n const denominator: bigint = BigInt(resource);\n\n return Number((numerator * BigInt(100)) / denominator);\n};\n\nexport const bytesToMiB = (value: string | number): string => {\n return `${(parseFloat(value.toString()) / 1024 / 1024).toFixed(0)}MiB`;\n};\n\nexport const formatMillicores = (value: string | number): string => {\n return `${(parseFloat(value.toString()) * 1000).toFixed(0)}m`;\n};\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n Theme,\n createStyles,\n makeStyles,\n} from '@material-ui/core';\nimport CloseIcon from '@material-ui/icons/Close';\nimport React, { useState } from 'react';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n dialogPaper: { minHeight: 'calc(100% - 64px)' },\n dialogContent: { flexBasis: 0 },\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\nexport interface KubernetesDialogProps {\n buttonAriaLabel: string;\n buttonIcon: React.ReactNode;\n buttonText: string;\n children?: React.ReactNode;\n disabled?: boolean;\n title: string;\n}\n\n/**\n * Dialog component for use in the Kubernetes plugin\n *\n * @public\n */\nexport const KubernetesDialog = ({\n buttonAriaLabel,\n buttonIcon,\n buttonText,\n children,\n disabled,\n title,\n}: KubernetesDialogProps) => {\n const classes = useStyles();\n\n const [open, setOpen] = useState(false);\n const openDialog = () => {\n setOpen(true);\n };\n const closeDialog = () => {\n setOpen(false);\n };\n\n return (\n <>\n <Dialog\n maxWidth=\"xl\"\n fullWidth\n open={open}\n onClose={closeDialog}\n PaperProps={{ className: classes.dialogPaper }}\n >\n <DialogTitle id=\"dialog-title\">\n {title}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent className={classes.dialogContent}>\n {children}\n </DialogContent>\n </Dialog>\n <Button\n variant=\"outlined\"\n aria-label={buttonAriaLabel}\n component=\"label\"\n disabled={disabled}\n onClick={openDialog}\n startIcon={buttonIcon}\n >\n {buttonText}\n </Button>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { AttachAddon, IAttachOptions } from 'xterm-addon-attach';\n\nexport class PodExecTerminalAttachAddon extends AttachAddon {\n #textEncoder = new TextEncoder();\n\n constructor(socket: WebSocket, options?: IAttachOptions) {\n super(socket, options);\n\n const thisAddon = this as any;\n\n // These methods are private in the original AttachAddon,\n // thus have to override at runtime like this\n thisAddon._sendBinary = (data: string) => {\n if (!thisAddon._checkOpenSocket()) {\n return;\n }\n\n const buffer = Uint8Array.from([0, ...this.#textEncoder.encode(data)]);\n\n thisAddon._socket.send(buffer);\n };\n\n thisAddon._sendData = (data: string) => {\n if (!thisAddon._checkOpenSocket()) {\n return;\n }\n\n thisAddon._sendBinary(data);\n };\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport 'xterm/css/xterm.css';\n\nimport { discoveryApiRef, useApi } from '@backstage/core-plugin-api';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { Terminal } from 'xterm';\nimport { FitAddon } from 'xterm-addon-fit';\n\nimport { PodExecTerminalAttachAddon } from './PodExecTerminalAttachAddon';\n\n/**\n * Props drilled down to the PodExecTerminal component\n *\n * @public\n */\nexport interface PodExecTerminalProps {\n clusterName: string;\n containerName: string;\n podName: string;\n podNamespace: string;\n}\n\nconst hasSocketProtocol = (url: string | URL) =>\n /wss?:\\/\\//.test(url.toString());\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n podExecTerminal: {\n width: '100%',\n height: '100%',\n '& .xterm-screen': { padding: theme.spacing(1) },\n },\n }),\n);\n\n/**\n * Executes a `/bin/sh` process in the given pod's container and opens a terminal connected to it\n *\n * @public\n */\nexport const PodExecTerminal = (props: PodExecTerminalProps) => {\n const classes = useStyles();\n const { containerName, podNamespace, podName } = props;\n\n const [baseUrl, setBaseUrl] = useState(window.location.host);\n\n const terminalRef = React.useRef(null);\n const discoveryApi = useApi(discoveryApiRef);\n const namespace = podNamespace ?? 'default';\n\n useEffect(() => {\n discoveryApi\n .getBaseUrl('kubernetes')\n .then(url => url ?? window.location.host)\n .then(url => url.replace(/^http(s?):\\/\\//, 'ws$1://'))\n .then(url => setBaseUrl(url));\n }, [discoveryApi]);\n\n const urlParams = useMemo(() => {\n const params = new URLSearchParams({\n container: containerName,\n stdin: 'true',\n stdout: 'true',\n stderr: 'true',\n tty: 'true',\n command: '/bin/sh',\n });\n return params;\n }, [containerName]);\n\n const socketUrl = useMemo(() => {\n if (!hasSocketProtocol(baseUrl)) {\n return '';\n }\n\n return new URL(\n `${baseUrl}/proxy/api/v1/namespaces/${namespace}/pods/${podName}/exec?${urlParams}`,\n );\n }, [baseUrl, namespace, podName, urlParams]);\n\n useEffect(() => {\n if (!hasSocketProtocol(socketUrl)) {\n return () => {};\n }\n\n const terminal = new Terminal();\n const fitAddon = new FitAddon();\n terminal.loadAddon(fitAddon);\n\n if (terminalRef.current) {\n terminal.open(terminalRef.current);\n fitAddon.fit();\n }\n\n terminal.writeln('Starting terminal, please wait...');\n\n const socket = new WebSocket(socketUrl, ['channel.k8s.io']);\n\n socket.onopen = () => {\n terminal.clear();\n const attachAddon = new PodExecTerminalAttachAddon(socket, {\n bidirectional: true,\n });\n\n terminal.loadAddon(attachAddon);\n };\n\n socket.onclose = () => {\n terminal.writeln('Socket connection closed');\n };\n\n return () => {\n terminal?.clear();\n socket?.close();\n };\n }, [baseUrl, socketUrl]);\n\n return (\n <div\n data-testid=\"terminal\"\n ref={terminalRef}\n className={classes.podExecTerminal}\n />\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';\nimport React from 'react';\n\nimport { KubernetesDialog } from '../KubernetesDialog';\nimport { useIsPodExecTerminalSupported } from '../../hooks';\nimport { PodExecTerminal, PodExecTerminalProps } from './PodExecTerminal';\n\n/**\n * Opens a terminal connected to the given pod's container in a dialog\n *\n * @public\n */\nexport const PodExecTerminalDialog = (props: PodExecTerminalProps) => {\n const { clusterName, containerName, podName } = props;\n\n const isPodExecTerminalSupported = useIsPodExecTerminalSupported();\n\n return (\n !isPodExecTerminalSupported.loading &&\n isPodExecTerminalSupported.value && (\n <KubernetesDialog\n buttonAriaLabel=\"open terminal\"\n buttonIcon={<OpenInBrowserIcon />}\n buttonText=\"Terminal\"\n disabled={\n isPodExecTerminalSupported.loading ||\n !isPodExecTerminalSupported.value\n }\n title={`${podName} - ${containerName} terminal shell on cluster ${clusterName}`}\n >\n <PodExecTerminal {...props} />\n </KubernetesDialog>\n )\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Grid, Typography } from '@material-ui/core';\n\nimport React from 'react';\nimport { GaugePropsGetColor, LinearGauge } from '@backstage/core-components';\nimport { currentToDeclaredResourceToPerc } from '../../utils/resources';\n\n/**\n * Context for Pod Metrics\n *\n * @public\n */\nexport interface ResourceUtilizationProps {\n compressed?: boolean;\n title: string;\n usage: number | string;\n total: number | string;\n totalFormatted: string;\n}\n\nconst getProgressColor: GaugePropsGetColor = ({\n palette,\n value,\n inverse,\n max,\n}) => {\n if (isNaN(value)) {\n return palette.status.pending;\n }\n const actualMax = max ? max : 100;\n const actualValue = inverse ? actualMax - value : value;\n\n if (actualValue >= actualMax) {\n return palette.status.error;\n } else if (actualValue > 90 || actualValue < 40) {\n return palette.status.warning;\n }\n\n return palette.status.ok;\n};\n\n/**\n * Context for Pod Metrics\n *\n * @public\n */\nexport const ResourceUtilization = ({\n compressed = false,\n title,\n usage,\n total,\n totalFormatted,\n}: ResourceUtilizationProps) => {\n const utilization = currentToDeclaredResourceToPerc(usage, total);\n return (\n <Grid container spacing={0}>\n <Grid item xs={12}>\n <Typography\n variant={compressed ? 'caption' : 'subtitle2'}\n >{`${title}: ${totalFormatted}`}</Typography>\n </Grid>\n <Grid item xs={12}>\n <LinearGauge\n getColor={getProgressColor}\n width={compressed ? 'thin' : 'thick'}\n value={utilization / 100}\n />\n {!compressed && (\n <Typography variant=\"caption\">usage: {`${utilization}%`}</Typography>\n )}\n </Grid>\n </Grid>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport useAsync from 'react-use/lib/useAsync';\n\nimport { ContainerScope } from './types';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { kubernetesProxyApiRef } from '../../../api/types';\n\n/**\n * Arguments for usePodLogs\n *\n * @public\n */\nexport interface PodLogsOptions {\n containerScope: ContainerScope;\n previous?: boolean;\n}\n\n/**\n * Retrieves the logs for the given pod\n *\n * @public\n */\nexport const usePodLogs = ({ containerScope, previous }: PodLogsOptions) => {\n const kubernetesProxyApi = useApi(kubernetesProxyApiRef);\n return useAsync(async () => {\n return await kubernetesProxyApi.getPodLogs({\n podName: containerScope.podName,\n namespace: containerScope.podNamespace,\n containerName: containerScope.containerName,\n clusterName: containerScope.clusterName,\n previous,\n });\n }, [JSON.stringify(containerScope)]);\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n DismissableBanner,\n EmptyState,\n LogViewer,\n} from '@backstage/core-components';\nimport { Paper } from '@material-ui/core';\nimport { Skeleton } from '@material-ui/lab';\n\nimport { ContainerScope } from './types';\nimport { usePodLogs } from './usePodLogs';\n\n/**\n * Props for PodLogs\n *\n * @public\n */\nexport interface PodLogsProps {\n containerScope: ContainerScope;\n previous?: boolean;\n}\n\n/**\n * Shows the logs for the given pod\n *\n * @public\n */\nexport const PodLogs: React.FC<PodLogsProps> = ({\n containerScope,\n previous,\n}: PodLogsProps) => {\n const { value, error, loading } = usePodLogs({\n containerScope,\n previous,\n });\n\n return (\n <>\n {error && (\n <DismissableBanner\n {...{\n message: error.message,\n variant: 'error',\n fixed: false,\n }}\n id=\"pod-logs\"\n />\n )}\n <Paper\n elevation={1}\n style={{ height: '100%', width: '100%', minHeight: '55rem' }}\n >\n {loading && <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />}\n {!loading &&\n value !== undefined &&\n (value.text === '' ? (\n <EmptyState\n missing=\"data\"\n title=\"No logs emitted\"\n description=\"No logs were emitted by the container\"\n />\n ) : (\n <LogViewer text={value.text} />\n ))}\n </Paper>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport SubjectIcon from '@material-ui/icons/Subject';\n\nimport { KubernetesDialog } from '../../KubernetesDialog';\nimport { PodLogs } from './PodLogs';\nimport { ContainerScope } from './types';\n\n/**\n * Props for PodLogsDialog\n *\n * @public\n */\nexport interface PodLogsDialogProps {\n containerScope: ContainerScope;\n}\n\n/**\n * Shows the logs for the given pod in a Dialog\n *\n * @public\n */\nexport const PodLogsDialog = ({ containerScope }: PodLogsDialogProps) => {\n return (\n <KubernetesDialog\n buttonAriaLabel=\"get logs\"\n buttonIcon={<SubjectIcon />}\n buttonText=\"Logs\"\n disabled={false}\n title={`${containerScope.podName} - ${containerScope.containerName} logs on cluster ${containerScope.clusterName}`}\n >\n <PodLogs containerScope={containerScope} />\n </KubernetesDialog>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { StructuredMetadataTable } from '@backstage/core-components';\nimport { ClientContainerStatus } from '@backstage/plugin-kubernetes-common';\nimport {\n Card,\n CardActions,\n CardContent,\n CardHeader,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport { IContainer, IContainerStatus } from 'kubernetes-models/v1';\nimport { DateTime } from 'luxon';\nimport React from 'react';\n\nimport { useIsPodExecTerminalEnabled } from '../../../hooks';\nimport { bytesToMiB, formatMillicores } from '../../../utils/resources';\nimport { PodExecTerminalDialog } from '../../PodExecTerminal/PodExecTerminalDialog';\nimport { ResourceUtilization } from '../../ResourceUtilization';\nimport { PodLogsDialog, PodScope } from '../PodLogs';\n\nconst getContainerHealthChecks = (\n containerSpec: IContainer,\n containerStatus: IContainerStatus,\n): { [key: string]: boolean } => {\n if (containerStatus.state?.terminated?.reason === 'Completed') {\n return {\n 'not waiting to start': containerStatus.state?.waiting === undefined,\n 'no restarts': containerStatus.restartCount === 0,\n };\n }\n return {\n 'not waiting to start': containerStatus.state?.waiting === undefined,\n started: !!containerStatus.started,\n ready: containerStatus.ready,\n 'no restarts': containerStatus.restartCount === 0,\n 'readiness probe set':\n containerSpec && containerSpec?.readinessProbe !== undefined,\n };\n};\n\nconst getCurrentState = (containerStatus: IContainerStatus): string => {\n return (\n containerStatus.state?.waiting?.reason ||\n containerStatus.state?.terminated?.reason ||\n (containerStatus.state?.running !== undefined ? 'Running' : 'Unknown')\n );\n};\n\nconst getStartedAtTime = (\n containerStatus: IContainerStatus,\n): string | undefined => {\n return (\n containerStatus.state?.running?.startedAt ||\n containerStatus.state?.terminated?.startedAt\n );\n};\n\ninterface ContainerDatetimeProps {\n prefix: string;\n dateTime: string;\n}\n\nconst ContainerDatetime = ({ prefix, dateTime }: ContainerDatetimeProps) => {\n return (\n <Typography variant=\"subtitle2\">\n {prefix}:{' '}\n {DateTime.fromISO(dateTime).toRelative({\n locale: 'en',\n })}\n </Typography>\n );\n};\n\n/**\n * Props for ContainerCard\n *\n * @public\n */\nexport interface ContainerCardProps {\n podScope: PodScope;\n containerSpec?: IContainer;\n containerStatus: IContainerStatus;\n containerMetrics?: ClientContainerStatus;\n}\n\n/**\n * Shows details about a container within a pod\n *\n * @public\n */\nexport const ContainerCard: React.FC<ContainerCardProps> = ({\n podScope,\n containerSpec,\n containerStatus,\n containerMetrics,\n}: ContainerCardProps) => {\n const isPodExecTerminalEnabled = useIsPodExecTerminalEnabled();\n\n // This should never be undefined\n if (containerSpec === undefined) {\n return <Typography>error reading pod from cluster</Typography>;\n }\n const containerStartedTime = getStartedAtTime(containerStatus);\n const containerFinishedTime = containerStatus.state?.terminated?.finishedAt;\n\n return (\n <Card>\n <CardHeader\n title={containerStatus.name}\n subheader={containerStatus.image}\n />\n <CardContent>\n <Grid container>\n <Grid item xs={12}>\n {containerStartedTime && (\n <ContainerDatetime\n prefix=\"Started\"\n dateTime={containerStartedTime}\n />\n )}\n {containerFinishedTime && (\n <ContainerDatetime\n prefix=\"Completed\"\n dateTime={containerFinishedTime}\n />\n )}\n {containerStartedTime && containerFinishedTime && (\n <Typography variant=\"subtitle2\">\n Execution time:{' '}\n {DateTime.fromISO(containerFinishedTime)\n .diff(DateTime.fromISO(containerStartedTime), [\n 'hours',\n 'minutes',\n 'seconds',\n ])\n .toHuman()}\n </Typography>\n )}\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n Status: {getCurrentState(containerStatus)}\n </Typography>\n </Grid>\n {containerStatus.restartCount > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">\n Restarts: {containerStatus.restartCount}\n </Typography>\n </Grid>\n )}\n <Grid item xs={12}>\n <Typography variant=\"subtitle2\">Container health</Typography>\n </Grid>\n <Grid item xs={12}>\n <StructuredMetadataTable\n metadata={getContainerHealthChecks(\n containerSpec,\n containerStatus,\n )}\n />\n </Grid>\n {containerMetrics && (\n <Grid container item xs={12} spacing={0}>\n <Grid item xs={12}>\n <Typography variant=\"subtitle1\">\n Resource utilization\n </Typography>\n </Grid>\n <Grid item xs={12} style={{ minHeight: '5rem' }}>\n <ResourceUtilization\n compressed\n title=\"CPU requests\"\n usage={containerMetrics.cpuUsage.currentUsage}\n total={containerMetrics.cpuUsage.requestTotal}\n totalFormatted={formatMillicores(\n containerMetrics.cpuUsage.requestTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"CPU limits\"\n usage={containerMetrics.cpuUsage.currentUsage}\n total={containerMetrics.cpuUsage.limitTotal}\n totalFormatted={formatMillicores(\n containerMetrics.cpuUsage.limitTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"Memory requests\"\n usage={containerMetrics.memoryUsage.currentUsage}\n total={containerMetrics.memoryUsage.requestTotal}\n totalFormatted={bytesToMiB(\n containerMetrics.memoryUsage.requestTotal,\n )}\n />\n <ResourceUtilization\n compressed\n title=\"Memory limits\"\n usage={containerMetrics.memoryUsage.currentUsage}\n total={containerMetrics.memoryUsage.limitTotal}\n totalFormatted={bytesToMiB(\n containerMetrics.memoryUsage.limitTotal,\n )}\n />\n </Grid>\n </Grid>\n )}\n </Grid>\n </CardContent>\n <CardActions>\n <PodLogsDialog\n containerScope={{\n containerName: containerStatus.name,\n ...podScope,\n }}\n />\n {isPodExecTerminalEnabled && (\n <PodExecTerminalDialog\n clusterName={podScope.clusterName}\n containerName={containerStatus.name}\n podName={podScope.podName}\n podNamespace={podScope.podNamespace}\n />\n )}\n </CardActions>\n </Card>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { CodeSnippet } from '@backstage/core-components';\nimport { FormControlLabel, Switch } from '@material-ui/core';\nimport jsyaml from 'js-yaml';\nimport React, { useState } from 'react';\n\n/**\n * Props of ManifestYaml\n *\n * @public\n */\nexport interface ManifestYamlProps {\n object: object;\n}\n\n/**\n * Renders a Kubernetes object as a YAML code snippet\n *\n * @public\n */\nexport const ManifestYaml = ({ object }: ManifestYamlProps) => {\n // Toggle whether the Kubernetes resource managed fields should be shown in\n // the YAML display. This toggle is only available when the YAML is being\n // shown because managed fields are never visible in the structured display.\n const [managedFields, setManagedFields] = useState<boolean>(false);\n return (\n <>\n <FormControlLabel\n control={\n <Switch\n checked={managedFields}\n onChange={event => {\n setManagedFields(event.target.checked);\n }}\n name=\"Managed Fields\"\n />\n }\n label=\"Managed Fields\"\n />\n <CodeSnippet\n language=\"yaml\"\n text={jsyaml.dump(object, {\n // NOTE: this will remove any field called `managedFields`\n // not just the metadata one\n // TODO: @mclarke make this only remove the `metadata.managedFields`\n replacer: (key: string, value: string): any => {\n if (!managedFields) {\n return key === 'managedFields' ? undefined : value;\n }\n return value;\n },\n })}\n />\n </>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { ChangeEvent, useContext, useState } from 'react';\nimport {\n Button,\n Typography,\n makeStyles,\n IconButton,\n createStyles,\n Theme,\n Drawer,\n Switch,\n FormControlLabel,\n Grid,\n} from '@material-ui/core';\nimport Close from '@material-ui/icons/Close';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\nimport { V1ObjectMeta } from '@kubernetes/client-node';\nimport { withStyles } from '@material-ui/core/styles';\nimport {\n LinkButton as BackstageButton,\n StructuredMetadataTable,\n WarningPanel,\n} from '@backstage/core-components';\nimport { ClusterContext } from '../../hooks';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\nimport { ManifestYaml } from './ManifestYaml';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { kubernetesClusterLinkFormatterApiRef } from '../../api';\nimport useAsync from 'react-use/lib/useAsync';\n\nconst useDrawerStyles = makeStyles((theme: Theme) =>\n createStyles({\n paper: {\n width: '50%',\n justifyContent: 'space-between',\n padding: theme.spacing(2.5),\n },\n }),\n);\n\nconst useDrawerContentStyles = makeStyles((_: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n errorMessage: {\n marginTop: '1em',\n marginBottom: '1em',\n },\n options: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n icon: {\n fontSize: 20,\n },\n content: {\n height: '80%',\n },\n }),\n);\n\nconst PodDrawerButton = withStyles({\n root: {\n padding: '6px 5px',\n },\n label: {\n textTransform: 'none',\n },\n})(Button);\n\n/**\n *\n *\n * @public\n */\nexport type LinkErrorPanelProps = {\n cluster: ClusterAttributes;\n errorMessage?: string;\n children?: React.ReactNode;\n};\n\n/**\n *\n *\n * @public\n */\nexport const LinkErrorPanel = ({\n cluster,\n errorMessage,\n}: LinkErrorPanelProps) => (\n <WarningPanel\n title=\"There was a problem formatting the link to the Kubernetes dashboard\"\n message={`Could not format the link to the dashboard of your cluster named '${\n cluster.name\n }'. Its dashboardApp property has been set to '${\n cluster.dashboardApp || 'standard'\n }.'`}\n >\n {errorMessage && (\n <Typography variant=\"body2\">Errors: {errorMessage}</Typography>\n )}\n </WarningPanel>\n);\n\n/**\n *\n *\n * @public\n */\nexport interface KubernetesDrawerable {\n metadata?: V1ObjectMeta;\n}\n\ninterface KubernetesStructuredMetadataTableDrawerContentProps<\n T extends KubernetesDrawerable,\n> {\n toggleDrawer: (e: ChangeEvent<{}>, isOpen: boolean) => void;\n object: T;\n renderObject: (obj: T) => object;\n kind: string;\n}\n\nfunction replaceNullsWithUndefined(someObj: any) {\n const replacer = (_: any, value: any) =>\n String(value) === 'null' || String(value) === 'undefined'\n ? undefined\n : value;\n\n return JSON.parse(JSON.stringify(someObj, replacer));\n}\n\nconst KubernetesStructuredMetadataTableDrawerContent = <\n T extends KubernetesDrawerable,\n>({\n toggleDrawer,\n object,\n renderObject,\n kind,\n}: KubernetesStructuredMetadataTableDrawerContentProps<T>) => {\n const [isYaml, setIsYaml] = useState<boolean>(false);\n\n const formatter = useApi(kubernetesClusterLinkFormatterApiRef);\n const classes = useDrawerContentStyles();\n const cluster = useContext(ClusterContext);\n const { value: clusterLink, error } = useAsync(\n async () =>\n formatter.formatClusterLink({\n dashboardUrl: cluster.dashboardUrl,\n dashboardApp: cluster.dashboardApp,\n dashboardParameters: cluster.dashboardParameters,\n object,\n kind,\n }),\n [cluster, object, kind, formatter],\n );\n\n return (\n <>\n <div className={classes.header}>\n <Grid container justifyContent=\"flex-start\" alignItems=\"flex-start\">\n <Grid item xs={11}>\n <Typography variant=\"h5\">\n {object.metadata?.name ?? 'unknown name'}\n </Typography>\n </Grid>\n <Grid item xs={1}>\n <IconButton\n key=\"dismiss\"\n title=\"Close the drawer\"\n onClick={e => toggleDrawer(e, false)}\n color=\"inherit\"\n >\n <Close className={classes.icon} />\n </IconButton>\n </Grid>\n <Grid item xs={11}>\n <Typography color=\"textSecondary\" variant=\"body1\">\n {kind}\n </Typography>\n </Grid>\n <Grid item xs={11}>\n <FormControlLabel\n control={\n <Switch\n checked={isYaml}\n onChange={event => {\n setIsYaml(event.target.checked);\n }}\n name=\"YAML\"\n />\n }\n label=\"YAML\"\n />\n </Grid>\n </Grid>\n </div>\n {error && (\n <div className={classes.errorMessage}>\n <LinkErrorPanel\n cluster={cluster}\n errorMessage={error.message || error.toString()}\n />\n </div>\n )}\n <div className={classes.options}>\n <div>\n {clusterLink && (\n <BackstageButton\n variant=\"outlined\"\n color=\"primary\"\n size=\"small\"\n to={clusterLink}\n endIcon={<OpenInNewIcon />}\n >\n Open Kubernetes Dashboard\n </BackstageButton>\n )}\n </div>\n </div>\n <div className={classes.content}>\n {isYaml && <ManifestYaml object={object} />}\n {!isYaml && (\n <StructuredMetadataTable\n metadata={renderObject(replaceNullsWithUndefined(object))}\n />\n )}\n </div>\n </>\n );\n};\n\n/**\n *\n * @public\n */\nexport interface KubernetesStructuredMetadataTableDrawerProps<\n T extends KubernetesDrawerable,\n> {\n object: T;\n renderObject: (obj: T) => object;\n buttonVariant?: 'h5' | 'subtitle2';\n kind: string;\n expanded?: boolean;\n children?: React.ReactNode;\n}\n\n/**\n *\n * @public\n */\nexport const KubernetesStructuredMetadataTableDrawer = <\n T extends KubernetesDrawerable,\n>({\n object,\n renderObject,\n kind,\n buttonVariant = 'subtitle2',\n expanded = false,\n children,\n}: KubernetesStructuredMetadataTableDrawerProps<T>) => {\n const [isOpen, setIsOpen] = useState(expanded);\n const classes = useDrawerStyles();\n\n const toggleDrawer = (e: ChangeEvent<{}>, newValue: boolean) => {\n e.stopPropagation();\n setIsOpen(newValue);\n };\n\n return (\n <>\n <PodDrawerButton\n onClick={e => toggleDrawer(e, true)}\n onFocus={event => event.stopPropagation()}\n >\n {children === undefined ? (\n <Typography variant={buttonVariant}>\n {object.metadata?.name ?? 'unknown object'}\n </Typography>\n ) : (\n children\n )}\n </PodDrawerButton>\n <Drawer\n classes={{\n paper: classes.paper,\n }}\n anchor=\"right\"\n open={isOpen}\n onClose={(e: any) => toggleDrawer(e, false)}\n onClick={event => event.stopPropagation()}\n >\n <KubernetesStructuredMetadataTableDrawerContent\n kind={kind}\n toggleDrawer={toggleDrawer}\n object={object}\n renderObject={renderObject}\n />\n </Drawer>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { ChangeEvent, useState } from 'react';\n\nimport { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta';\nimport {\n createStyles,\n Drawer,\n makeStyles,\n Theme,\n Grid,\n IconButton,\n Switch,\n Typography,\n Button,\n withStyles,\n FormControlLabel,\n} from '@material-ui/core';\nimport CloseIcon from '@material-ui/icons/Close';\nimport { ManifestYaml } from './ManifestYaml';\n\nconst useDrawerContentStyles = makeStyles((_theme: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n content: {\n height: '80%',\n },\n icon: {\n fontSize: 20,\n },\n }),\n);\n\n/**\n * The type of object that can be represented by the Drawer\n *\n * @public\n */\nexport interface KubernetesObject {\n kind: string;\n metadata?: IObjectMeta;\n}\n\ninterface KubernetesDrawerContentProps {\n close: () => void;\n kubernetesObject: KubernetesObject;\n header?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nconst KubernetesDrawerContent = ({\n children,\n header,\n kubernetesObject,\n close,\n}: KubernetesDrawerContentProps) => {\n const classes = useDrawerContentStyles();\n const [isYaml, setIsYaml] = useState<boolean>(false);\n\n return (\n <>\n <div className={classes.header}>\n <Grid container justifyContent=\"flex-start\" alignItems=\"flex-start\">\n <Grid item xs={11}>\n <Typography variant=\"h5\">\n {kubernetesObject.metadata?.name}\n </Typography>\n </Grid>\n <Grid item xs={1}>\n <IconButton\n key=\"dismiss\"\n title=\"Close the drawer\"\n onClick={() => close()}\n color=\"inherit\"\n >\n <CloseIcon className={classes.icon} />\n </IconButton>\n </Grid>\n <Grid item xs={12}>\n {header}\n </Grid>\n <Grid item xs={12}>\n <FormControlLabel\n control={\n <Switch\n checked={isYaml}\n onChange={event => {\n setIsYaml(event.target.checked);\n }}\n name=\"YAML\"\n />\n }\n label=\"YAML\"\n />\n </Grid>\n </Grid>\n </div>\n <div className={classes.content}>\n {isYaml && <ManifestYaml object={kubernetesObject} />}\n {!isYaml && children}\n </div>\n </>\n );\n};\n\n/**\n * Props of KubernetesDrawer\n *\n * @public\n */\nexport interface KubernetesDrawerProps {\n open?: boolean;\n kubernetesObject: KubernetesObject;\n label: React.ReactNode;\n drawerContentsHeader?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nconst useDrawerStyles = makeStyles((theme: Theme) =>\n createStyles({\n paper: {\n width: '50%',\n justifyContent: 'space-between',\n padding: theme.spacing(2.5),\n },\n }),\n);\n\nconst DrawerButton = withStyles({\n root: {\n padding: '6px 5px',\n },\n label: {\n textTransform: 'none',\n },\n})(Button);\n\n/**\n * Button/Drawer component for Kubernetes Objects\n *\n * @public\n */\nexport const KubernetesDrawer = ({\n open,\n label,\n drawerContentsHeader,\n kubernetesObject,\n children,\n}: KubernetesDrawerProps) => {\n const classes = useDrawerStyles();\n const [isOpen, setIsOpen] = useState<boolean>(open ?? false);\n\n const toggleDrawer = (e: ChangeEvent<{}>, newValue: boolean) => {\n e.stopPropagation();\n setIsOpen(newValue);\n };\n\n return (\n <>\n <DrawerButton onClick={() => setIsOpen(true)}>{label}</DrawerButton>\n <Drawer\n classes={{\n paper: classes.paper,\n }}\n anchor=\"right\"\n open={isOpen}\n onClose={(e: any) => toggleDrawer(e, false)}\n onClick={event => event.stopPropagation()}\n >\n {isOpen && (\n <KubernetesDrawerContent\n header={drawerContentsHeader}\n kubernetesObject={kubernetesObject}\n children={children}\n close={() => setIsOpen(false)}\n />\n )}\n </Drawer>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { Grid, List, ListItem, Typography } from '@material-ui/core';\nimport { IPodCondition, Pod } from 'kubernetes-models/v1';\nimport {\n StatusError,\n StatusOK,\n StatusWarning,\n} from '@backstage/core-components';\nimport { DateTime } from 'luxon';\n\ninterface PodConditionProps {\n condition: IPodCondition;\n}\n\nconst PodCondition = ({ condition }: PodConditionProps) => {\n return (\n <>\n {condition.status === 'False' && (\n <StatusError>\n {condition.type} - ({condition.reason}{' '}\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n ) - {condition.message}{' '}\n </StatusError>\n )}\n {condition.status === 'True' && (\n <StatusOK>\n {condition.type} - (\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n )\n </StatusOK>\n )}\n {condition.status === 'Unknown' && (\n <StatusWarning>\n {condition.type} - (\n {condition.lastTransitionTime &&\n DateTime.fromISO(condition.lastTransitionTime).toRelative({\n locale: 'en',\n })}\n ) {condition.message}\n </StatusWarning>\n )}\n </>\n );\n};\n\n/**\n * Props for PendingPodContent\n *\n * @public\n */\nexport interface PendingPodContentProps {\n pod: Pod;\n}\n\n/**\n * Shows details about pod's conditions as it starts\n *\n * @public\n */\nexport const PendingPodContent = ({ pod }: PendingPodContentProps) => {\n // TODO add PodHasNetwork when it's out of alpha\n // https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-conditions\n const startupConditions = [\n pod.status?.conditions?.find(c => c.type === 'PodScheduled'),\n pod.status?.conditions?.find(c => c.type === 'Initialized'),\n pod.status?.conditions?.find(c => c.type === 'ContainersReady'),\n pod.status?.conditions?.find(c => c.type === 'Ready'),\n ].filter((c): c is IPodCondition => !!c); // filter out undefined\n return (\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Pod is Pending. Conditions:</Typography>\n <List>\n {startupConditions.map(c => (\n <ListItem key={c.type}>\n <PodCondition condition={c} />\n </ListItem>\n ))}\n </List>\n </Grid>\n </Grid>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/lib/useAsync';\nimport { kubernetesProxyApiRef } from '../../../api/types';\n\n/**\n * Arguments for useEvents\n *\n * @public\n */\nexport interface EventsOptions {\n involvedObjectName: string;\n namespace: string;\n clusterName: string;\n}\n\n/**\n * Retrieves the events for the given object\n *\n * @public\n */\nexport const useEvents = ({\n involvedObjectName,\n namespace,\n clusterName,\n}: EventsOptions) => {\n const kubernetesProxyApi = useApi(kubernetesProxyApiRef);\n return useAsync(async () => {\n return await kubernetesProxyApi.getEventsByInvolvedObjectName({\n involvedObjectName,\n namespace,\n clusterName,\n });\n }, [involvedObjectName, namespace, clusterName]);\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n Avatar,\n Container,\n Grid,\n List,\n ListItem,\n ListItemAvatar,\n ListItemText,\n Tooltip,\n Typography,\n} from '@material-ui/core';\n\nimport InfoIcon from '@material-ui/icons/Info';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport { DateTime } from 'luxon';\n\nimport { useEvents } from './useEvents';\nimport { Skeleton } from '@material-ui/lab';\nimport { DismissableBanner } from '@backstage/core-components';\nimport { Event } from 'kubernetes-models/v1';\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsContentProps {\n warningEventsOnly?: boolean;\n events: Event[];\n}\n\nconst getAvatarByType = (type?: string) => {\n return (\n <ListItemAvatar>\n <Avatar>{type === 'Warning' ? <WarningIcon /> : <InfoIcon />}</Avatar>\n </ListItemAvatar>\n );\n};\n\n/**\n * Shows given Kubernetes events\n *\n * @public\n */\nexport const EventsContent = ({\n events,\n warningEventsOnly,\n}: EventsContentProps) => {\n if (events.length === 0) {\n return <Typography>No events found</Typography>;\n }\n\n return (\n <Container>\n <Grid>\n <List>\n {events\n .filter(event => {\n if (warningEventsOnly) {\n return event.type === 'Warning';\n }\n return true;\n })\n .map(event => {\n const timeAgo = event.metadata.creationTimestamp\n ? DateTime.fromISO(event.metadata.creationTimestamp).toRelative(\n {\n locale: 'en',\n },\n )\n : 'unknown';\n return (\n <ListItem key={event.metadata.name}>\n <Tooltip title={`${event.type ?? ''} event`}>\n {getAvatarByType(event.type)}\n </Tooltip>\n <ListItemText\n primary={`First event ${timeAgo} (count: ${event.count})`}\n secondary={`${event.reason}: ${event.message}`}\n />\n </ListItem>\n );\n })}\n </List>\n </Grid>\n </Container>\n );\n};\n\n/**\n * Props for Events\n *\n * @public\n */\nexport interface EventsProps {\n involvedObjectName: string;\n namespace: string;\n clusterName: string;\n warningEventsOnly?: boolean;\n}\n\n/**\n * Retrieves and shows Kubernetes events for the given object\n *\n * @public\n */\nexport const Events = ({\n involvedObjectName,\n namespace,\n clusterName,\n warningEventsOnly,\n}: EventsProps) => {\n const { value, error, loading } = useEvents({\n involvedObjectName,\n namespace,\n clusterName,\n });\n\n return (\n <>\n {error && (\n <DismissableBanner\n {...{\n message: error.message,\n variant: 'error',\n fixed: false,\n }}\n id=\"events\"\n />\n )}\n {loading && <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />}\n {!loading && value !== undefined && (\n <EventsContent warningEventsOnly={warningEventsOnly} events={value} />\n )}\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState } from 'react';\n\nimport { Button, Grid } from '@material-ui/core';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport IconButton from '@material-ui/core/IconButton';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport CloseIcon from '@material-ui/icons/Close';\nimport HelpIcon from '@material-ui/icons/Help';\nimport OpenInNewIcon from '@material-ui/icons/OpenInNew';\n\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { DetectedError } from '@backstage/plugin-kubernetes-common';\nimport { PodLogs } from '../PodLogs';\nimport { Events } from '../Events';\nimport { LinkButton } from '@backstage/core-components';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\n/**\n * Props for FixDialog\n *\n * @public\n */\nexport interface FixDialogProps {\n open?: boolean;\n clusterName: string;\n pod: Pod;\n error: DetectedError;\n}\n\n/**\n * A dialog for fixing detected Kubernetes errors\n *\n * @public\n */\nexport const FixDialog: React.FC<FixDialogProps> = ({\n open,\n pod,\n error,\n clusterName,\n}: FixDialogProps) => {\n const [isOpen, setOpen] = useState(!!open);\n const classes = useStyles();\n\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n\n const pf = error.proposedFix;\n\n const dialogContent = () => {\n return (\n <Grid container>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Detected error:</Typography>\n <Typography>{error.message}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Cause explanation:</Typography>\n <Typography>\n {error.proposedFix?.rootCauseExplanation ?? 'unknown'}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Fix:</Typography>\n <Typography>\n <ul>\n {(error.proposedFix?.actions ?? []).map((fix, i) => {\n return (\n <li key={`${pod.metadata?.name ?? 'unknown'}-pf-${i}`}>\n {fix}\n </li>\n );\n })}\n </ul>\n </Typography>\n </Grid>\n\n {pf && pf.type === 'logs' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Crash logs:</Typography>\n </Grid>\n <Grid item xs={9}>\n <PodLogs\n previous\n containerScope={{\n podName: pod.metadata?.name ?? 'unknown',\n podNamespace: pod.metadata?.namespace ?? 'unknown',\n clusterName: clusterName,\n containerName: pf.container,\n }}\n />\n </Grid>\n </>\n )}\n {pf && pf.type === 'events' && (\n <>\n <Grid item xs={12}>\n <Typography variant=\"h6\">Events:</Typography>\n </Grid>\n <Grid item xs={9}>\n <Events\n warningEventsOnly\n involvedObjectName={pod.metadata?.name ?? ''}\n namespace={pod.metadata?.namespace ?? ''}\n clusterName={clusterName}\n />\n </Grid>\n </>\n )}\n </Grid>\n );\n };\n\n return (\n <>\n <Button\n variant=\"outlined\"\n aria-label=\"fix issue\"\n component=\"label\"\n onClick={openDialog}\n startIcon={<HelpIcon />}\n >\n Help\n </Button>\n <Dialog maxWidth=\"xl\" fullWidth open={isOpen} onClose={closeDialog}>\n <DialogTitle id=\"dialog-title\">\n {pod.metadata?.name} - {error.type}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent>{dialogContent()}</DialogContent>\n <DialogActions>\n {pf && pf.type === 'docs' && (\n <LinkButton\n to={pf.docsLink}\n variant=\"outlined\"\n startIcon={<OpenInNewIcon />}\n target=\"_blank\"\n rel=\"noopener\"\n >\n Open docs\n </LinkButton>\n )}\n </DialogActions>\n </Dialog>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport {\n List,\n ListItem,\n ListItemText,\n Divider,\n createStyles,\n makeStyles,\n Theme,\n Paper,\n Grid,\n} from '@material-ui/core';\nimport { PodAndErrors } from '../types';\nimport { FixDialog } from '../FixDialog/FixDialog';\n\nconst useStyles = makeStyles((_theme: Theme) =>\n createStyles({\n root: {\n overflow: 'auto',\n },\n list: {\n width: '100%',\n },\n }),\n);\n\n/**\n * Props for ErrorList\n *\n * @public\n */\nexport interface ErrorListProps {\n podAndErrors: PodAndErrors[];\n}\n\n/**\n * Shows a list of errors found on a Pod\n *\n * @public\n */\nexport const ErrorList = ({ podAndErrors }: ErrorListProps) => {\n const classes = useStyles();\n return (\n <Paper className={classes.root}>\n <List className={classes.list}>\n {podAndErrors\n .filter(pae => pae.errors.length > 0)\n .flatMap(onlyPodWithErrors => {\n return onlyPodWithErrors.errors.map((error, i) => {\n return (\n <React.Fragment\n key={`${\n onlyPodWithErrors.pod.metadata?.name ?? 'unknown'\n }-eli-${i}`}\n >\n {i > 0 && <Divider key={`error-divider${i}`} />}\n <ListItem>\n <Grid container>\n <Grid item xs={9}>\n <ListItemText\n primary={error.message}\n secondary={onlyPodWithErrors.pod.metadata?.name}\n />\n </Grid>\n <Grid item xs={3}>\n <FixDialog\n pod={onlyPodWithErrors.pod}\n error={error}\n clusterName={onlyPodWithErrors.clusterName}\n />\n </Grid>\n </Grid>\n </ListItem>\n </React.Fragment>\n );\n });\n })}\n </List>\n </Paper>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\n\nimport { ItemCardGrid } from '@backstage/core-components';\nimport {\n createStyles,\n makeStyles,\n Theme,\n Grid,\n Typography,\n} from '@material-ui/core';\n\nimport { Pod } from 'kubernetes-models/v1';\n\nimport { ContainerCard } from './ContainerCard';\n\nimport { PodAndErrors } from '../types';\nimport { KubernetesDrawer } from '../../KubernetesDrawer';\nimport { PendingPodContent } from './PendingPodContent';\nimport { ErrorList } from '../ErrorList';\nimport { usePodMetrics } from '../../../hooks/usePodMetrics';\nimport { ResourceUtilization } from '../../ResourceUtilization';\nimport { bytesToMiB, formatMillicores } from '../../../utils/resources';\n\nconst useDrawerContentStyles = makeStyles((_theme: Theme) =>\n createStyles({\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n content: {\n height: '80%',\n },\n icon: {\n fontSize: 20,\n },\n podoklist: {\n width: '100%',\n maxWidth: 360,\n maxHeight: 360,\n },\n }),\n);\n\nfunction getContainerSpecByName(pod: Pod, containerName: string) {\n return pod.spec?.containers.find(c => c.name === containerName);\n}\n\n/**\n * Props for PodDrawer\n *\n * @public\n */\nexport interface PodDrawerProps {\n open?: boolean;\n podAndErrors: PodAndErrors;\n}\n\n/**\n * A Drawer for Kubernetes Pods\n *\n * @public\n */\nexport const PodDrawer = ({ podAndErrors, open }: PodDrawerProps) => {\n const classes = useDrawerContentStyles();\n const podMetrics = usePodMetrics(podAndErrors.clusterName, podAndErrors.pod);\n\n return (\n <KubernetesDrawer\n open={open}\n drawerContentsHeader={\n <Typography variant=\"subtitle1\">\n Pod{' '}\n {podAndErrors.pod.status?.podIP &&\n `(${podAndErrors.pod.status?.podIP})`}\n </Typography>\n }\n kubernetesObject={podAndErrors.pod}\n label={\n <Typography variant=\"subtitle1\">\n {podAndErrors.pod.metadata?.name ?? 'unknown'}\n </Typography>\n }\n >\n <div className={classes.content}>\n {podMetrics && (\n <Grid container item xs={12}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Resource utilization</Typography>\n </Grid>\n <Grid item xs={6}>\n <ResourceUtilization\n title=\"CPU requests\"\n usage={podMetrics.cpu.currentUsage}\n total={podMetrics.cpu.requestTotal}\n totalFormatted={formatMillicores(podMetrics.cpu.requestTotal)}\n />\n <ResourceUtilization\n title=\"CPU limits\"\n usage={podMetrics.cpu.currentUsage}\n total={podMetrics.cpu.limitTotal}\n totalFormatted={formatMillicores(podMetrics.cpu.limitTotal)}\n />\n </Grid>\n <Grid item xs={6}>\n <ResourceUtilization\n title=\"Memory requests\"\n usage={podMetrics.memory.currentUsage}\n total={podMetrics.memory.requestTotal}\n totalFormatted={bytesToMiB(podMetrics.memory.requestTotal)}\n />\n <ResourceUtilization\n title=\"Memory limits\"\n usage={podMetrics.memory.currentUsage}\n total={podMetrics.memory.limitTotal}\n totalFormatted={bytesToMiB(podMetrics.memory.requestTotal)}\n />\n </Grid>\n </Grid>\n )}\n {podAndErrors.pod.status?.phase === 'Pending' && (\n <PendingPodContent pod={podAndErrors.pod} />\n )}\n {podAndErrors.pod.status?.containerStatuses?.length && (\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Typography variant=\"h5\">Containers</Typography>\n </Grid>\n <Grid item xs={12}>\n <ItemCardGrid>\n {podAndErrors.pod.status?.containerStatuses?.map(\n (containerStatus, i) => {\n const containerSpec = getContainerSpecByName(\n podAndErrors.pod,\n containerStatus.name,\n );\n const containerMetrics = (\n podMetrics?.containers ?? []\n ).find(c => c.container === containerStatus.name);\n return (\n <ContainerCard\n key={`container-card-${podAndErrors.pod.metadata?.name}-${i}`}\n containerMetrics={containerMetrics}\n podScope={{\n podName: podAndErrors.pod.metadata?.name ?? 'unknown',\n podNamespace:\n podAndErrors.pod.metadata?.namespace ?? 'unknown',\n clusterName: podAndErrors.clusterName,\n }}\n containerSpec={containerSpec}\n containerStatus={containerStatus}\n />\n );\n },\n )}\n </ItemCardGrid>\n </Grid>\n {podAndErrors.errors.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h5\">Errors</Typography>\n </Grid>\n )}\n {podAndErrors.errors.length > 0 && (\n <Grid item xs={12}>\n <ErrorList podAndErrors={[podAndErrors]} />\n </Grid>\n )}\n </Grid>\n )}\n </div>\n </KubernetesDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n V1Pod,\n V1PodCondition,\n V1DeploymentCondition,\n} from '@kubernetes/client-node';\nimport React, { Fragment, ReactNode } from 'react';\nimport { Chip } from '@material-ui/core';\nimport {\n StatusAborted,\n StatusError,\n StatusOK,\n SubvalueCell,\n} from '@backstage/core-components';\nimport { ClientPodStatus } from '@backstage/plugin-kubernetes-common';\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { bytesToMiB, formatMillicores } from './resources';\n\nexport const imageChips = (pod: V1Pod): ReactNode => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n const images = containerStatuses.map((cs, i) => {\n return <Chip key={i} label={`${cs.name}=${cs.image}`} size=\"small\" />;\n });\n\n return <div>{images}</div>;\n};\n\nexport const containersReady = (pod: Pod): string => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n const containersReadyItem = containerStatuses.filter(cs => cs.ready).length;\n\n return `${containersReadyItem}/${containerStatuses.length}`;\n};\n\nexport const totalRestarts = (pod: Pod): number => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n return containerStatuses?.reduce((a, b) => a + b.restartCount, 0);\n};\n\nexport const containerStatuses = (pod: Pod): ReactNode => {\n const containerStatusesItem = pod.status?.containerStatuses ?? [];\n const errors = containerStatusesItem.reduce((accum, next) => {\n if (next.state === undefined) {\n return accum;\n }\n\n const waiting = next.state.waiting;\n const terminated = next.state.terminated;\n\n const renderCell = (reason: string | undefined) => (\n <Fragment key={`${pod.metadata?.name}-${next.name}`}>\n <SubvalueCell\n value={\n reason === 'Completed' ? (\n <StatusOK>Container: {next.name}</StatusOK>\n ) : (\n <StatusError>Container: {next.name}</StatusError>\n )\n }\n subvalue={reason}\n />\n <br />\n </Fragment>\n );\n\n if (waiting) {\n accum.push(renderCell(waiting.reason));\n }\n\n if (terminated) {\n accum.push(renderCell(terminated.reason));\n }\n\n return accum;\n }, [] as React.ReactNode[]);\n\n if (errors.length === 0) {\n return <StatusOK>OK</StatusOK>;\n }\n\n return errors;\n};\n\nexport const renderCondition = (\n condition: V1PodCondition | V1DeploymentCondition,\n): [string, ReactNode] => {\n const status = condition.status;\n\n if (status === 'True') {\n return [condition.type, <StatusOK>True</StatusOK>];\n } else if (status === 'False') {\n return [\n condition.type,\n <SubvalueCell\n value={<StatusError>False</StatusError>}\n subvalue={condition.message ?? ''}\n />,\n ];\n }\n return [condition.type, <StatusAborted />];\n};\n\n// visible for testing\nexport const currentToDeclaredResourceToPerc = (\n current: number | string,\n resource: number | string,\n): string => {\n if (Number(resource) === 0) return `0%`;\n\n if (typeof current === 'number' && typeof resource === 'number') {\n return `${Math.round((current / resource) * 100)}%`;\n }\n\n const numerator: bigint = BigInt(\n typeof current === 'number' ? Math.round(current) : current,\n );\n const denominator: bigint = BigInt(\n typeof resource === 'number' ? Math.round(resource) : resource,\n );\n\n return `${(numerator * BigInt(100)) / denominator}%`;\n};\n\nexport const podStatusToCpuUtil = (podStatus: ClientPodStatus): ReactNode => {\n const cpuUtil = podStatus.cpu;\n\n let currentUsage: number | string = cpuUtil.currentUsage;\n\n // current usage number for CPU is a different unit than request/limit total\n // this might be a bug in the k8s library\n if (typeof cpuUtil.currentUsage === 'number') {\n currentUsage = cpuUtil.currentUsage / 10;\n }\n\n return (\n <SubvalueCell\n value={`requests: ${currentToDeclaredResourceToPerc(\n currentUsage,\n cpuUtil.requestTotal,\n )} of ${formatMillicores(cpuUtil.requestTotal)}`}\n subvalue={`limits: ${currentToDeclaredResourceToPerc(\n currentUsage,\n cpuUtil.limitTotal,\n )} of ${formatMillicores(cpuUtil.limitTotal)}`}\n />\n );\n};\n\nexport const podStatusToMemoryUtil = (\n podStatus: ClientPodStatus,\n): ReactNode => {\n const memUtil = podStatus.memory;\n\n return (\n <SubvalueCell\n value={`requests: ${currentToDeclaredResourceToPerc(\n memUtil.currentUsage,\n memUtil.requestTotal,\n )} of ${bytesToMiB(memUtil.requestTotal)}`}\n subvalue={`limits: ${currentToDeclaredResourceToPerc(\n memUtil.currentUsage,\n memUtil.limitTotal,\n )} of ${bytesToMiB(memUtil.limitTotal)}`}\n />\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport { PodDrawer } from './PodDrawer';\nimport {\n containersReady,\n containerStatuses,\n podStatusToCpuUtil,\n podStatusToMemoryUtil,\n totalRestarts,\n} from '../../utils/pod';\nimport { Table, TableColumn } from '@backstage/core-components';\nimport { ClusterContext } from '../../hooks/Cluster';\nimport { useMatchingErrors } from '../../hooks/useMatchingErrors';\nimport { Pod } from 'kubernetes-models/v1/Pod';\nimport { V1Pod } from '@kubernetes/client-node';\nimport { usePodMetrics } from '../../hooks/usePodMetrics';\nimport { Typography } from '@material-ui/core';\n\n/**\n *\n *\n * @public\n */\nexport const READY_COLUMNS: PodColumns = 'READY';\n\n/**\n *\n *\n * @public\n */\nexport const RESOURCE_COLUMNS: PodColumns = 'RESOURCE';\n\n/**\n *\n *\n * @public\n */\nexport type PodColumns = 'READY' | 'RESOURCE';\n\n/**\n *\n *\n * @public\n */\nexport type PodsTablesProps = {\n pods: Pod | V1Pod[];\n extraColumns?: PodColumns[];\n children?: React.ReactNode;\n};\n\nconst READY: TableColumn<Pod>[] = [\n {\n title: 'containers ready',\n align: 'center',\n render: containersReady,\n width: 'auto',\n },\n {\n title: 'total restarts',\n align: 'center',\n render: totalRestarts,\n type: 'numeric',\n width: 'auto',\n },\n];\n\nconst PodDrawerTrigger = ({ pod }: { pod: Pod }) => {\n const cluster = useContext(ClusterContext);\n const errors = useMatchingErrors({\n kind: 'Pod',\n apiVersion: 'v1',\n metadata: pod.metadata,\n });\n return (\n <PodDrawer\n podAndErrors={{\n pod: pod as any,\n clusterName: cluster.name,\n errors: errors,\n }}\n />\n );\n};\n\nconst Cpu = ({ clusterName, pod }: { clusterName: string; pod: Pod }) => {\n const metrics = usePodMetrics(clusterName, pod);\n\n if (!metrics) {\n return <Typography>unknown</Typography>;\n }\n\n return <>{podStatusToCpuUtil(metrics)}</>;\n};\n\nconst Memory = ({ clusterName, pod }: { clusterName: string; pod: Pod }) => {\n const metrics = usePodMetrics(clusterName, pod);\n\n if (!metrics) {\n return <Typography>unknown</Typography>;\n }\n\n return <>{podStatusToMemoryUtil(metrics)}</>;\n};\n\n/**\n *\n *\n * @public\n */\nexport const PodsTable = ({ pods, extraColumns = [] }: PodsTablesProps) => {\n const cluster = useContext(ClusterContext);\n const defaultColumns: TableColumn<Pod>[] = [\n {\n title: 'ID',\n field: 'metadata.uid',\n hidden: true,\n },\n {\n title: 'name',\n highlight: true,\n render: (pod: Pod) => {\n return <PodDrawerTrigger pod={pod} />;\n },\n },\n {\n title: 'phase',\n render: (pod: Pod) => pod.status?.phase ?? 'unknown',\n width: 'auto',\n },\n {\n title: 'status',\n render: containerStatuses,\n },\n ];\n const columns: TableColumn<Pod>[] = [...defaultColumns];\n\n if (extraColumns.includes(READY_COLUMNS)) {\n columns.push(...READY);\n }\n if (extraColumns.includes(RESOURCE_COLUMNS)) {\n const resourceColumns: TableColumn<Pod>[] = [\n {\n title: 'CPU usage %',\n render: (pod: Pod) => {\n return <Cpu clusterName={cluster.name} pod={pod} />;\n },\n width: 'auto',\n },\n {\n title: 'Memory usage %',\n render: (pod: Pod) => {\n return <Memory clusterName={cluster.name} pod={pod} />;\n },\n width: 'auto',\n },\n ];\n columns.push(...resourceColumns);\n }\n\n const tableStyle = {\n minWidth: '0',\n width: '100%',\n };\n\n return (\n <div style={tableStyle}>\n <Table\n options={{ paging: true, search: false, emptyRowsWhenPaging: false }}\n // It was observed that in some instances the pod drawer closes when new data (like CPU usage) is available and the table reloads.\n // Mapping the metadata UID to the tables ID fixes this problem.\n data={\n (pods as Pod[]).map((pod: Pod) => ({\n ...pod,\n id: pod?.metadata?.uid,\n })) as any as Pod[]\n }\n columns={columns}\n />\n </div>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1Deployment } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { renderCondition } from '../../utils/pod';\nimport { Typography, Grid, Chip } from '@material-ui/core';\n\nexport const DeploymentDrawer = ({\n deployment,\n expanded,\n}: {\n deployment: V1Deployment;\n expanded?: boolean;\n}) => {\n const namespace = deployment.metadata?.namespace;\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={deployment}\n expanded={expanded}\n kind=\"Deployment\"\n renderObject={(deploymentObj: V1Deployment) => {\n const conditions = (deploymentObj.status?.conditions ?? [])\n .map(renderCondition)\n .reduce((accum, next) => {\n accum[next[0]] = next[1];\n return accum;\n }, {} as { [key: string]: React.ReactNode });\n\n return {\n strategy: deploymentObj.spec?.strategy ?? '???',\n minReadySeconds: deploymentObj.spec?.minReadySeconds ?? '???',\n progressDeadlineSeconds:\n deploymentObj.spec?.progressDeadlineSeconds ?? '???',\n ...conditions,\n };\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {deployment.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Deployment\n </Typography>\n </Grid>\n {namespace && (\n <Grid item>\n <Chip size=\"small\" label={`namespace: ${namespace}`} />\n </Grid>\n )}\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1HorizontalPodAutoscaler } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\n\n/** @public */\nexport const HorizontalPodAutoscalerDrawer = (props: {\n hpa: V1HorizontalPodAutoscaler;\n expanded?: boolean;\n children?: React.ReactNode;\n}) => {\n const { hpa, expanded, children } = props;\n\n return (\n <KubernetesStructuredMetadataTableDrawer\n kind=\"HorizontalPodAutoscaler\"\n object={hpa}\n expanded={expanded}\n renderObject={(hpaObject: V1HorizontalPodAutoscaler) => {\n return {\n targetCPUUtilizationPercentage:\n hpaObject.spec?.targetCPUUtilizationPercentage,\n currentCPUUtilizationPercentage:\n hpaObject.status?.currentCPUUtilizationPercentage,\n minReplicas: hpaObject.spec?.minReplicas,\n maxReplicas: hpaObject.spec?.maxReplicas,\n currentReplicas: hpaObject.status?.currentReplicas,\n desiredReplicas: hpaObject.status?.desiredReplicas,\n };\n }}\n >\n {children}\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { V1ObjectMeta } from '@kubernetes/client-node/dist/gen/model/v1ObjectMeta';\nimport {\n V1HorizontalPodAutoscaler,\n V1Pod,\n V1ReplicaSet,\n} from '@kubernetes/client-node';\n\ninterface CanOwn {\n metadata?: V1ObjectMeta;\n}\n\ninterface CanBeOwned {\n metadata?: V1ObjectMeta;\n}\n\nexport function getOwnedResources<R extends CanBeOwned>(\n potentialOwner: CanOwn,\n possiblyOwned: R[],\n): R[] {\n return possiblyOwned.filter(\n p =>\n p.metadata?.ownerReferences?.some(\n o => o.uid === potentialOwner.metadata?.uid,\n ) ?? false,\n );\n}\n\nexport const getOwnedPodsThroughReplicaSets = (\n potentialOwner: CanOwn,\n replicaSets: V1ReplicaSet[],\n pods: V1Pod[],\n) => {\n return getOwnedResources(\n potentialOwner,\n replicaSets.filter(rs => rs.status && rs.status.replicas > 0),\n ).reduce((accum, rs) => {\n return accum.concat(getOwnedResources(rs, pods));\n }, [] as V1Pod[]);\n};\n\ninterface ResourceRef {\n kind: string;\n namespace?: string;\n name?: string;\n}\n\nexport const getMatchingHpa = (\n owner: ResourceRef,\n hpas: V1HorizontalPodAutoscaler[],\n): V1HorizontalPodAutoscaler | undefined => {\n return hpas.find(hpa => {\n return (\n (hpa.spec?.scaleTargetRef?.kind ?? '').toLocaleLowerCase('en-US') ===\n owner.kind.toLocaleLowerCase('en-US') &&\n (hpa.metadata?.namespace ?? '') ===\n (owner.namespace ?? 'unknown-namespace') &&\n (hpa.spec?.scaleTargetRef?.name ?? '') ===\n (owner.name ?? 'unknown-deployment')\n );\n });\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport {\n V1Deployment,\n V1Pod,\n V1HorizontalPodAutoscaler,\n} from '@kubernetes/client-node';\nimport { PodsTable } from '../Pods';\nimport { DeploymentDrawer } from './DeploymentDrawer';\nimport { HorizontalPodAutoscalerDrawer } from '../HorizontalPodAutoscalers';\nimport {\n getOwnedPodsThroughReplicaSets,\n getMatchingHpa,\n} from '../../utils/owner';\nimport {\n GroupedResponsesContext,\n PodNamesWithErrorsContext,\n} from '../../hooks';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { READY_COLUMNS, RESOURCE_COLUMNS } from '../Pods/PodsTable';\n\ntype DeploymentsAccordionsProps = {\n children?: React.ReactNode;\n};\n\ntype DeploymentAccordionProps = {\n deployment: V1Deployment;\n ownedPods: V1Pod[];\n matchingHpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\ntype DeploymentSummaryProps = {\n deployment: V1Deployment;\n numberOfCurrentPods: number;\n numberOfPodsWithErrors: number;\n hpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\nconst DeploymentSummary = ({\n deployment,\n numberOfCurrentPods,\n numberOfPodsWithErrors,\n hpa,\n}: DeploymentSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={4} item>\n <DeploymentDrawer deployment={deployment} />\n </Grid>\n {hpa && (\n <Grid item xs={4}>\n <HorizontalPodAutoscalerDrawer hpa={hpa}>\n <Grid\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"subtitle2\">\n min replicas {hpa.spec?.minReplicas ?? '?'} / max replicas{' '}\n {hpa.spec?.maxReplicas ?? '?'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n current CPU usage:{' '}\n {hpa.status?.currentCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n target CPU usage:{' '}\n {hpa.spec?.targetCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n </Grid>\n </HorizontalPodAutoscalerDrawer>\n </Grid>\n )}\n <Grid\n item\n container\n xs={4}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{numberOfCurrentPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>\n {numberOfPodsWithErrors} pod\n {numberOfPodsWithErrors > 1 ? 's' : ''} with errors\n </StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\nconst DeploymentAccordion = ({\n deployment,\n ownedPods,\n matchingHpa,\n}: DeploymentAccordionProps) => {\n const podNamesWithErrors = useContext(PodNamesWithErrorsContext);\n\n const podsWithErrors = ownedPods.filter(p =>\n podNamesWithErrors.has(p.metadata?.name ?? ''),\n );\n\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <DeploymentSummary\n deployment={deployment}\n numberOfCurrentPods={ownedPods.length}\n numberOfPodsWithErrors={podsWithErrors.length}\n hpa={matchingHpa}\n />\n </AccordionSummary>\n <AccordionDetails>\n <PodsTable\n pods={ownedPods}\n extraColumns={[READY_COLUMNS, RESOURCE_COLUMNS]}\n />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const DeploymentsAccordions = ({}: DeploymentsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.deployments.map((deployment, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <DeploymentAccordion\n matchingHpa={getMatchingHpa(\n {\n name: deployment.metadata?.name,\n namespace: deployment.metadata?.namespace,\n kind: 'deployment',\n },\n groupedResponses.horizontalPodAutoscalers,\n )}\n ownedPods={getOwnedPodsThroughReplicaSets(\n deployment,\n groupedResponses.replicaSets,\n groupedResponses.pods,\n )}\n deployment={deployment}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1StatefulSet } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { renderCondition } from '../../utils/pod';\nimport { Typography, Grid, Chip } from '@material-ui/core';\n\nexport const StatefulSetDrawer = ({\n statefulset,\n expanded,\n}: {\n statefulset: V1StatefulSet;\n expanded?: boolean;\n}) => {\n const namespace = statefulset.metadata?.namespace;\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={statefulset}\n expanded={expanded}\n kind=\"StatefulSet\"\n renderObject={(statefulsetObj: V1StatefulSet) => {\n const conditions = (statefulsetObj.status?.conditions ?? [])\n .map(renderCondition)\n .reduce((accum, next) => {\n accum[next[0]] = next[1];\n return accum;\n }, {} as { [key: string]: React.ReactNode });\n\n return {\n updateStrategy: statefulset.spec?.updateStrategy ?? '???',\n podManagementPolicy: statefulset.spec?.podManagementPolicy ?? '???',\n serviceName: statefulset.spec?.serviceName ?? '???',\n selector: statefulset.spec?.selector ?? '???',\n revisionHistoryLimit: statefulset.spec?.revisionHistoryLimit ?? '???',\n ...conditions,\n };\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {statefulset.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Stateful Set\n </Typography>\n </Grid>\n {namespace && (\n <Grid item>\n <Chip size=\"small\" label={`namespace: ${namespace}`} />\n </Grid>\n )}\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport {\n V1Pod,\n V1HorizontalPodAutoscaler,\n V1StatefulSet,\n} from '@kubernetes/client-node';\nimport { PodsTable } from '../Pods';\nimport { StatefulSetDrawer } from './StatefulSetDrawer';\nimport { HorizontalPodAutoscalerDrawer } from '../HorizontalPodAutoscalers';\nimport { getMatchingHpa, getOwnedResources } from '../../utils/owner';\nimport {\n GroupedResponsesContext,\n PodNamesWithErrorsContext,\n} from '../../hooks';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { READY_COLUMNS, RESOURCE_COLUMNS } from '../Pods/PodsTable';\n\ntype StatefulSetsAccordionsProps = {\n children?: React.ReactNode;\n};\n\ntype StatefulSetAccordionProps = {\n statefulset: V1StatefulSet;\n ownedPods: V1Pod[];\n matchingHpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\ntype StatefulSetSummaryProps = {\n statefulset: V1StatefulSet;\n numberOfCurrentPods: number;\n numberOfPodsWithErrors: number;\n hpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\nconst StatefulSetSummary = ({\n statefulset,\n numberOfCurrentPods,\n numberOfPodsWithErrors,\n hpa,\n}: StatefulSetSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <StatefulSetDrawer statefulset={statefulset} />\n </Grid>\n {hpa && (\n <Grid item xs={3}>\n <HorizontalPodAutoscalerDrawer hpa={hpa}>\n <Grid\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"subtitle2\">\n min replicas {hpa.spec?.minReplicas ?? '?'} / max replicas{' '}\n {hpa.spec?.maxReplicas ?? '?'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n current CPU usage:{' '}\n {hpa.status?.currentCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n target CPU usage:{' '}\n {hpa.spec?.targetCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n </Grid>\n </HorizontalPodAutoscalerDrawer>\n </Grid>\n )}\n <Grid\n item\n container\n xs={3}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{numberOfCurrentPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>\n {numberOfPodsWithErrors} pod\n {numberOfPodsWithErrors > 1 ? 's' : ''} with errors\n </StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\nconst StatefulSetAccordion = ({\n statefulset,\n ownedPods,\n matchingHpa,\n}: StatefulSetAccordionProps) => {\n const podNamesWithErrors = useContext(PodNamesWithErrorsContext);\n\n const podsWithErrors = ownedPods.filter(p =>\n podNamesWithErrors.has(p.metadata?.name ?? ''),\n );\n\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <StatefulSetSummary\n statefulset={statefulset}\n numberOfCurrentPods={ownedPods.length}\n numberOfPodsWithErrors={podsWithErrors.length}\n hpa={matchingHpa}\n />\n </AccordionSummary>\n <AccordionDetails>\n <PodsTable\n pods={ownedPods}\n extraColumns={[READY_COLUMNS, RESOURCE_COLUMNS]}\n />\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const StatefulSetsAccordions = ({}: StatefulSetsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.statefulsets.map((statefulset, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <StatefulSetAccordion\n matchingHpa={getMatchingHpa(\n {\n name: statefulset.metadata?.name,\n namespace: statefulset.metadata?.namespace,\n kind: 'statefulset',\n },\n groupedResponses.horizontalPodAutoscalers,\n )}\n ownedPods={getOwnedResources(statefulset, groupedResponses.pods)}\n statefulset={statefulset}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1Ingress } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const IngressDrawer = ({\n ingress,\n expanded,\n}: {\n ingress: V1Ingress;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={ingress}\n expanded={expanded}\n kind=\"Ingress\"\n renderObject={(ingressObject: V1Ingress) => {\n return ingressObject.spec || {};\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {ingress.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Ingress\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Ingress } from '@kubernetes/client-node';\nimport { IngressDrawer } from './IngressDrawer';\nimport { GroupedResponsesContext } from '../../hooks';\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\n/**\n *\n *\n * @public\n */\nexport type IngressesAccordionsProps = {};\n\ntype IngressAccordionProps = {\n ingress: V1Ingress;\n};\n\ntype IngressSummaryProps = {\n ingress: V1Ingress;\n};\n\nconst IngressSummary = ({ ingress }: IngressSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n >\n <Grid xs={12} item>\n <IngressDrawer ingress={ingress} />\n </Grid>\n </Grid>\n );\n};\n\ntype IngressCardProps = {\n ingress: V1Ingress;\n};\n\nconst IngressCard = ({ ingress }: IngressCardProps) => {\n return (\n <StructuredMetadataTable\n metadata={{\n ...ingress.spec,\n }}\n />\n );\n};\n\nconst IngressAccordion = ({ ingress }: IngressAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <IngressSummary ingress={ingress} />\n </AccordionSummary>\n <AccordionDetails>\n <IngressCard ingress={ingress} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\n/**\n *\n *\n * @public\n */\nexport const IngressesAccordions = ({}: IngressesAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.ingresses.map((ingress, i) => (\n <Grid item key={i} xs>\n <IngressAccordion ingress={ingress} />\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { V1Service } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const ServiceDrawer = ({\n service,\n expanded,\n}: {\n service: V1Service;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={service}\n expanded={expanded}\n kind=\"Service\"\n renderObject={(serviceObject: V1Service) => {\n return serviceObject.spec || {};\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {service.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Service\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Service } from '@kubernetes/client-node';\nimport { ServiceDrawer } from './ServiceDrawer';\nimport { GroupedResponsesContext } from '../../hooks';\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\ntype ServiceSummaryProps = {\n service: V1Service;\n};\n\nconst ServiceSummary = ({ service }: ServiceSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={8} item>\n <ServiceDrawer service={service} />\n </Grid>\n\n <Grid item>\n <Typography variant=\"subtitle2\">\n Type: {service.spec?.type ?? '?'}\n </Typography>\n </Grid>\n </Grid>\n );\n};\n\ntype ServiceCardProps = {\n service: V1Service;\n};\n\nconst ServiceCard = ({ service }: ServiceCardProps) => {\n const metadata: any = {};\n\n if (service.status?.loadBalancer?.ingress?.length ?? -1 > 0) {\n metadata.loadbalancer = service.status?.loadBalancer;\n }\n\n if (service.spec?.type === 'ClusterIP') {\n metadata.clusterIP = service.spec.clusterIP;\n }\n if (service.spec?.type === 'ExternalName') {\n metadata.externalName = service.spec.externalName;\n }\n\n return (\n <StructuredMetadataTable\n metadata={{\n type: service.spec?.type,\n ports: service.spec?.ports,\n ...metadata,\n }}\n />\n );\n};\n\n/**\n *\n *\n * @public\n */\nexport type ServicesAccordionsProps = {};\n\ntype ServiceAccordionProps = {\n service: V1Service;\n};\n\nconst ServiceAccordion = ({ service }: ServiceAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <ServiceSummary service={service} />\n </AccordionSummary>\n <AccordionDetails>\n <ServiceCard service={service} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\n/**\n *\n *\n * @public\n */\nexport const ServicesAccordions = ({}: ServicesAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.services.map((service, i) => (\n <Grid item key={i} xs>\n <ServiceAccordion service={service} />\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { V1Job } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const JobDrawer = ({\n job,\n expanded,\n}: {\n job: V1Job;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={job}\n expanded={expanded}\n kind=\"Job\"\n renderObject={(jobObj: V1Job) => {\n return {\n parallelism: jobObj.spec?.parallelism ?? '???',\n completions: jobObj.spec?.completions ?? '???',\n backoffLimit: jobObj.spec?.backoffLimit ?? '???',\n startTime: jobObj.status?.startTime ?? '???',\n };\n }}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {job.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Job\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Job, V1Pod } from '@kubernetes/client-node';\nimport { PodsTable } from '../Pods';\nimport { JobDrawer } from './JobsDrawer';\nimport { getOwnedResources } from '../../utils/owner';\nimport { GroupedResponsesContext } from '../../hooks';\nimport {\n StatusError,\n StatusOK,\n StatusPending,\n} from '@backstage/core-components';\n\n/**\n *\n *\n * @public\n */\nexport type JobsAccordionsProps = {\n jobs: V1Job[];\n children?: React.ReactNode;\n};\n\ntype JobAccordionProps = {\n job: V1Job;\n ownedPods: V1Pod[];\n children?: React.ReactNode;\n};\n\ntype JobSummaryProps = {\n job: V1Job;\n children?: React.ReactNode;\n};\n\nconst JobSummary = ({ job }: JobSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <JobDrawer job={job} />\n </Grid>\n <Grid\n item\n container\n xs={6}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n {job.status?.succeeded && <StatusOK>Succeeded</StatusOK>}\n {job.status?.active && <StatusPending>Running</StatusPending>}\n {job.status?.failed && <StatusError>Failed</StatusError>}\n </Grid>\n <Grid item>Start time: {job.status?.startTime?.toString()}</Grid>\n {job.status?.completionTime && (\n <Grid item>\n Completion time: {job.status.completionTime.toString()}\n </Grid>\n )}\n </Grid>\n </Grid>\n );\n};\n\nconst JobAccordion = ({ job, ownedPods }: JobAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <JobSummary job={job} />\n </AccordionSummary>\n <AccordionDetails>\n <PodsTable pods={ownedPods} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\n/**\n *\n *\n * @public\n */\nexport const JobsAccordions = ({ jobs }: JobsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {jobs.map((job, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <JobAccordion\n ownedPods={getOwnedResources(job, groupedResponses.pods)}\n job={job}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { V1CronJob } from '@kubernetes/client-node';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid, Chip } from '@material-ui/core';\n\nexport const CronJobDrawer = ({\n cronJob,\n expanded,\n}: {\n cronJob: V1CronJob;\n expanded?: boolean;\n}) => {\n const namespace = cronJob.metadata?.namespace;\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={cronJob}\n expanded={expanded}\n kind=\"CronJob\"\n renderObject={(cronJobObj: V1CronJob) => ({\n schedule: cronJobObj.spec?.schedule ?? '???',\n startingDeadlineSeconds:\n cronJobObj.spec?.startingDeadlineSeconds ?? '???',\n concurrencyPolicy: cronJobObj.spec?.concurrencyPolicy ?? '???',\n lastScheduleTime: cronJobObj.status?.lastScheduleTime ?? '???',\n })}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {cronJob.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n CronJob\n </Typography>\n </Grid>\n {namespace && (\n <Grid item>\n <Chip size=\"small\" label={`namespace: ${namespace}`} />\n </Grid>\n )}\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport cronstrue from 'cronstrue';\n\n// Defined at https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/\nconst k8sCronAliases = new Map([\n ['@yearly', '0 0 1 1 *'],\n ['@annually', '0 0 1 1 *'],\n ['@monthly', '0 0 1 * *'],\n ['@weekly', '0 0 * * 0'],\n ['@daily', '0 0 * * *'],\n ['@midnight', '0 0 * * *'],\n ['@hourly', '0 * * * *'],\n]);\n\n// humanizeCron takes into account the aliases provided by kubernetes before\n// calling cronstrue. In an effort to not throw an error, it will return the\n// original cron formatted schedule if the cronstrue call fails.\nexport const humanizeCron = (schedule: string): string => {\n const deAliasedSchedule = k8sCronAliases.get(schedule) || schedule;\n try {\n return cronstrue.toString(deAliasedSchedule);\n } catch (e) {\n return deAliasedSchedule;\n }\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1CronJob, V1Job } from '@kubernetes/client-node';\nimport { JobsAccordions } from '../JobsAccordions';\nimport { CronJobDrawer } from './CronJobsDrawer';\nimport { getOwnedResources } from '../../utils/owner';\nimport { GroupedResponsesContext } from '../../hooks';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { humanizeCron } from '../../utils/crons';\n\n/**\n *\n *\n * @public\n */\nexport type CronJobsAccordionsProps = {\n children?: React.ReactNode;\n};\n\ntype CronJobAccordionProps = {\n cronJob: V1CronJob;\n ownedJobs: V1Job[];\n children?: React.ReactNode;\n};\n\ntype CronJobSummaryProps = {\n cronJob: V1CronJob;\n children?: React.ReactNode;\n};\n\nconst CronJobSummary = ({ cronJob }: CronJobSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <CronJobDrawer cronJob={cronJob} />\n </Grid>\n <Grid\n item\n container\n xs={6}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n {cronJob.spec?.suspend ? (\n <StatusError>Suspended</StatusError>\n ) : (\n <StatusOK>Active</StatusOK>\n )}\n </Grid>\n <Grid item>\n <Typography variant=\"body1\">\n Schedule:{' '}\n {cronJob.spec?.schedule\n ? `${cronJob.spec.schedule} (${humanizeCron(\n cronJob.spec.schedule,\n )})`\n : 'N/A'}\n </Typography>\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\nconst CronJobAccordion = ({ cronJob, ownedJobs }: CronJobAccordionProps) => {\n return (\n <Accordion TransitionProps={{ unmountOnExit: true }} variant=\"outlined\">\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <CronJobSummary cronJob={cronJob} />\n </AccordionSummary>\n <AccordionDetails>\n <JobsAccordions jobs={ownedJobs.reverse()} />\n </AccordionDetails>\n </Accordion>\n );\n};\n\n/**\n *\n *\n * @public\n */\nexport const CronJobsAccordions = ({}: CronJobsAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {groupedResponses.cronJobs.map((cronJob, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <CronJobAccordion\n ownedJobs={getOwnedResources(cronJob, groupedResponses.jobs)}\n cronJob={cronJob}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { KubernetesStructuredMetadataTableDrawer } from '../../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nexport const RolloutDrawer = ({\n rollout,\n expanded,\n}: {\n rollout: any;\n expanded?: boolean;\n}) => {\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={rollout}\n expanded={expanded}\n kind=\"Rollout\"\n renderObject={() => ({})}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {rollout.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Rollout\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { Step, StepLabel, Stepper } from '@material-ui/core';\nimport Typography from '@material-ui/core/Typography';\nimport {\n ArgoRolloutCanaryStep,\n SetWeightStep,\n PauseStep,\n AnalysisStep,\n} from './types';\n\ninterface StepsProgressProps {\n currentStepIndex: number;\n aborted: boolean;\n steps: ArgoRolloutCanaryStep[];\n children?: React.ReactNode;\n}\n\nconst isSetWeightStep = (step: ArgoRolloutCanaryStep): step is SetWeightStep =>\n step.hasOwnProperty('setWeight');\n\nconst isPauseStep = (step: ArgoRolloutCanaryStep): step is PauseStep =>\n step.hasOwnProperty('pause');\n\nconst isAnalysisStep = (step: ArgoRolloutCanaryStep): step is AnalysisStep =>\n step.hasOwnProperty('analysis');\n\nconst createLabelForStep = (step: ArgoRolloutCanaryStep): React.ReactNode => {\n if (isSetWeightStep(step)) {\n return `setWeight ${step.setWeight}%`;\n } else if (isPauseStep(step)) {\n return step.pause.duration === undefined\n ? 'infinite pause'\n : `pause for ${step.pause.duration}`;\n } else if (isAnalysisStep(step)) {\n return (\n <div>\n <Typography paragraph>analysis templates:</Typography>\n {step.analysis.templates.map((t, i) => (\n <Typography paragraph key={i}>{`${t.templateName}${\n t.clusterScope ? ' (cluster scoped)' : ''\n }`}</Typography>\n ))}\n </div>\n );\n }\n return 'unknown step';\n};\n\nexport const StepsProgress = ({\n currentStepIndex,\n aborted,\n steps,\n}: StepsProgressProps) => {\n // If the activeStep is greater/equal to the number of steps\n // Then the canary is being promoted\n // Increase the step index to mark the 'canary promoted' step as done also\n const activeStepIndex =\n currentStepIndex >= steps.length ? currentStepIndex + 1 : currentStepIndex;\n\n /*\n * When the Rollout is aborted set the active step to -1\n * otherwise it appears to always be on the first step\n */\n return (\n <Stepper activeStep={aborted ? -1 : activeStepIndex} alternativeLabel>\n {steps\n .map((step, i) => (\n <Step key={i}>\n <StepLabel data-testid={`step-${i}`}>\n {createLabelForStep(step)}\n </StepLabel>\n </Step>\n ))\n .concat(\n <Step key=\"-1\">\n <StepLabel data-testid=\"step--1\">Canary promoted</StepLabel>\n </Step>,\n )}\n </Stepper>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { V1Pod, V1HorizontalPodAutoscaler } from '@kubernetes/client-node';\nimport { PodsTable } from '../../Pods';\nimport { HorizontalPodAutoscalerDrawer } from '../../HorizontalPodAutoscalers';\nimport { RolloutDrawer } from './RolloutDrawer';\nimport PauseIcon from '@material-ui/icons/Pause';\nimport ErrorOutlineIcon from '@material-ui/icons/ErrorOutline';\nimport { DateTime } from 'luxon';\nimport { StepsProgress } from './StepsProgress';\nimport {\n PodNamesWithErrorsContext,\n GroupedResponsesContext,\n} from '../../../hooks';\nimport {\n getMatchingHpa,\n getOwnedPodsThroughReplicaSets,\n} from '../../../utils/owner';\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { READY_COLUMNS, RESOURCE_COLUMNS } from '../../Pods/PodsTable';\n\ntype RolloutAccordionsProps = {\n rollouts: any[];\n defaultExpanded?: boolean;\n children?: React.ReactNode;\n};\n\ntype RolloutAccordionProps = {\n rollout: any;\n ownedPods: V1Pod[];\n defaultExpanded?: boolean;\n matchingHpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\ntype RolloutSummaryProps = {\n rollout: any;\n numberOfCurrentPods: number;\n numberOfPodsWithErrors: number;\n hpa?: V1HorizontalPodAutoscaler;\n children?: React.ReactNode;\n};\n\nconst AbortedTitle = (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n }}\n >\n <ErrorOutlineIcon />\n <Typography variant=\"subtitle1\">Aborted</Typography>\n </div>\n);\n\nconst findAbortedMessage = (rollout: any): string | undefined =>\n rollout.status?.conditions?.find(\n (c: any) =>\n c.type === 'Progressing' &&\n c.status === 'False' &&\n c.reason === 'RolloutAborted',\n )?.message;\n\nconst RolloutSummary = ({\n rollout,\n numberOfCurrentPods,\n numberOfPodsWithErrors,\n hpa,\n}: RolloutSummaryProps) => {\n const pauseTime: string | undefined = rollout.status?.pauseConditions?.find(\n (p: any) => p.reason === 'CanaryPauseStep',\n )?.startTime;\n const abortedMessage = findAbortedMessage(rollout);\n\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={6} item>\n <RolloutDrawer rollout={rollout} />\n </Grid>\n {hpa && (\n <Grid item xs={3}>\n <HorizontalPodAutoscalerDrawer hpa={hpa}>\n <Grid\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"subtitle2\">\n min replicas {hpa.spec?.minReplicas ?? '?'} / max replicas{' '}\n {hpa.spec?.maxReplicas ?? '?'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n current CPU usage:{' '}\n {hpa.status?.currentCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n <Grid item>\n <Typography variant=\"subtitle2\">\n target CPU usage:{' '}\n {hpa.spec?.targetCPUUtilizationPercentage ?? '?'}%\n </Typography>\n </Grid>\n </Grid>\n </HorizontalPodAutoscalerDrawer>\n </Grid>\n )}\n <Grid\n item\n container\n xs={3}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{numberOfCurrentPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>\n {numberOfPodsWithErrors} pod\n {numberOfPodsWithErrors > 1 ? 's' : ''} with errors\n </StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n {pauseTime && (\n <Grid item xs={3}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n }}\n >\n <PauseIcon />\n <Typography variant=\"subtitle1\">\n Paused ({DateTime.fromISO(pauseTime).toRelative({ locale: 'en' })}\n )\n </Typography>\n </div>\n </Grid>\n )}\n {abortedMessage && (\n <Grid item xs={3}>\n {AbortedTitle}\n </Grid>\n )}\n </Grid>\n );\n};\n\nconst RolloutAccordion = ({\n rollout,\n ownedPods,\n matchingHpa,\n defaultExpanded,\n}: RolloutAccordionProps) => {\n const podNamesWithErrors = useContext(PodNamesWithErrorsContext);\n\n const podsWithErrors = ownedPods.filter(p =>\n podNamesWithErrors.has(p.metadata?.name ?? ''),\n );\n\n const currentStepIndex = rollout.status?.currentStepIndex ?? 0;\n const abortedMessage = findAbortedMessage(rollout);\n\n return (\n <Accordion\n defaultExpanded={defaultExpanded}\n TransitionProps={{ unmountOnExit: true }}\n variant=\"outlined\"\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <RolloutSummary\n rollout={rollout}\n numberOfCurrentPods={ownedPods.length}\n numberOfPodsWithErrors={podsWithErrors.length}\n hpa={matchingHpa}\n />\n </AccordionSummary>\n <AccordionDetails>\n <div style={{ width: '100%' }}>\n <div>\n <Typography variant=\"h6\">Rollout status</Typography>\n </div>\n <div style={{ margin: '1rem' }}>\n {abortedMessage && (\n <>\n {AbortedTitle}\n <Typography variant=\"subtitle2\">{abortedMessage}</Typography>\n </>\n )}\n <StepsProgress\n aborted={abortedMessage !== undefined}\n steps={rollout.spec?.strategy?.canary?.steps ?? []}\n currentStepIndex={currentStepIndex}\n />\n </div>\n <div>\n <PodsTable\n pods={ownedPods}\n extraColumns={[READY_COLUMNS, RESOURCE_COLUMNS]}\n />\n </div>\n </div>\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const RolloutAccordions = ({\n rollouts,\n defaultExpanded = false,\n}: RolloutAccordionsProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {rollouts.map((rollout, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <RolloutAccordion\n defaultExpanded={defaultExpanded}\n matchingHpa={getMatchingHpa(\n {\n name: rollout.metadata?.name,\n namespace: rollout.metadata?.namespace,\n kind: 'rollout',\n },\n groupedResponses.horizontalPodAutoscalers,\n )}\n ownedPods={getOwnedPodsThroughReplicaSets(\n rollout,\n groupedResponses.replicaSets,\n groupedResponses.pods,\n )}\n rollout={rollout}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer';\nimport { Typography, Grid } from '@material-ui/core';\n\nconst capitalize = (str: string) =>\n str.charAt(0).toLocaleUpperCase('en-US') + str.slice(1);\n\nexport const DefaultCustomResourceDrawer = ({\n customResource,\n customResourceName,\n expanded,\n}: {\n customResource: any;\n customResourceName: string;\n expanded?: boolean;\n}) => {\n const capitalizedName = capitalize(customResourceName);\n\n return (\n <KubernetesStructuredMetadataTableDrawer\n object={customResource}\n expanded={expanded}\n kind={capitalizedName}\n renderObject={cr => cr}\n >\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item>\n <Typography variant=\"body1\">\n {customResource.metadata?.name ?? 'unknown object'}\n </Typography>\n </Grid>\n <Grid item>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n {capitalizedName}\n </Typography>\n </Grid>\n </Grid>\n </KubernetesStructuredMetadataTableDrawer>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { DefaultCustomResourceDrawer } from './DefaultCustomResourceDrawer';\nimport { StructuredMetadataTable } from '@backstage/core-components';\n\ntype DefaultCustomResourceAccordionsProps = {\n customResources: any[];\n customResourceName: string;\n defaultExpanded?: boolean;\n children?: React.ReactNode;\n};\n\ntype DefaultCustomResourceAccordionProps = {\n customResource: any;\n customResourceName: string;\n defaultExpanded?: boolean;\n children?: React.ReactNode;\n};\n\ntype DefaultCustomResourceSummaryProps = {\n customResource: any;\n customResourceName: string;\n children?: React.ReactNode;\n};\n\nconst DefaultCustomResourceSummary = ({\n customResource,\n customResourceName,\n}: DefaultCustomResourceSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n >\n <Grid xs={12} item>\n <DefaultCustomResourceDrawer\n customResource={customResource}\n customResourceName={customResourceName}\n />\n </Grid>\n </Grid>\n );\n};\n\nconst DefaultCustomResourceAccordion = ({\n customResource,\n customResourceName,\n defaultExpanded,\n}: DefaultCustomResourceAccordionProps) => {\n return (\n <Accordion\n defaultExpanded={defaultExpanded}\n TransitionProps={{ unmountOnExit: true }}\n variant=\"outlined\"\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <DefaultCustomResourceSummary\n customResource={customResource}\n customResourceName={customResourceName}\n />\n </AccordionSummary>\n <AccordionDetails>\n {Object.prototype.hasOwnProperty.call(customResource, 'status') && (\n <StructuredMetadataTable metadata={customResource.status} />\n )}\n </AccordionDetails>\n </Accordion>\n );\n};\n\nexport const DefaultCustomResourceAccordions = ({\n customResources,\n customResourceName,\n defaultExpanded = false,\n}: DefaultCustomResourceAccordionsProps) => {\n return (\n <Grid\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n {customResources.map((cr, i) => (\n <Grid container item key={i} xs>\n <Grid item xs>\n <DefaultCustomResourceAccordion\n defaultExpanded={defaultExpanded}\n customResource={cr}\n customResourceName={customResourceName}\n />\n </Grid>\n </Grid>\n ))}\n </Grid>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useContext } from 'react';\nimport lodash, { Dictionary } from 'lodash';\nimport { RolloutAccordions } from './ArgoRollouts';\nimport { DefaultCustomResourceAccordions } from './DefaultCustomResource';\nimport { GroupedResponsesContext } from '../../hooks';\n\n/**\n *\n *\n * @public\n */\nexport interface CustomResourcesProps {\n children?: React.ReactNode;\n}\n\nconst kindToResource = (customResources: any[]): Dictionary<any[]> => {\n return lodash.groupBy(customResources, value => {\n return value.kind;\n });\n};\n\n/**\n *\n *\n * @public\n */\nexport const CustomResources = ({}: CustomResourcesProps) => {\n const groupedResponses = useContext(GroupedResponsesContext);\n const kindToResourceMap = kindToResource(groupedResponses.customResources);\n\n return (\n <>\n {Object.entries(kindToResourceMap).map(([kind, resources], i) => {\n switch (kind) {\n case 'Rollout':\n return <RolloutAccordions key={i} rollouts={resources} />;\n default:\n return (\n <DefaultCustomResourceAccordions\n key={i}\n customResources={resources}\n customResourceName={kind}\n />\n );\n }\n })}\n </>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport {\n ClientPodStatus,\n ClusterObjects,\n groupResponses,\n} from '@backstage/plugin-kubernetes-common';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { DeploymentsAccordions } from '../DeploymentsAccordions';\nimport { StatefulSetsAccordions } from '../StatefulSetsAccordions';\nimport { IngressesAccordions } from '../IngressesAccordions';\nimport { ServicesAccordions } from '../ServicesAccordions';\nimport { CronJobsAccordions } from '../CronJobsAccordions';\nimport { CustomResources } from '../CustomResources';\nimport {\n ClusterContext,\n GroupedResponsesContext,\n PodNamesWithErrorsContext,\n} from '../../hooks';\n\nimport { StatusError, StatusOK } from '@backstage/core-components';\nimport { PodMetricsContext } from '../../hooks/usePodMetrics';\n\ntype ClusterSummaryProps = {\n clusterName: string;\n totalNumberOfPods: number;\n numberOfPodsWithErrors: number;\n children?: React.ReactNode;\n};\n\nconst ClusterSummary = ({\n clusterName,\n totalNumberOfPods,\n numberOfPodsWithErrors,\n}: ClusterSummaryProps) => {\n return (\n <Grid\n container\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid\n xs={6}\n item\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n spacing={0}\n >\n <Grid item xs>\n <Typography variant=\"body1\">{clusterName}</Typography>\n <Typography color=\"textSecondary\" variant=\"subtitle1\">\n Cluster\n </Typography>\n </Grid>\n </Grid>\n <Grid\n item\n container\n xs={3}\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-end\"\n spacing={0}\n >\n <Grid item>\n <StatusOK>{totalNumberOfPods} pods</StatusOK>\n </Grid>\n <Grid item>\n {numberOfPodsWithErrors > 0 ? (\n <StatusError>{numberOfPodsWithErrors} pods with errors</StatusError>\n ) : (\n <StatusOK>No pods with errors</StatusOK>\n )}\n </Grid>\n </Grid>\n </Grid>\n );\n};\n\n/**\n * Props for Cluster\n *\n * @public\n */\nexport type ClusterProps = {\n clusterObjects: ClusterObjects;\n podsWithErrors: Set<string>;\n children?: React.ReactNode;\n};\n\n/**\n * Component for rendering Kubernetes resources in a cluster\n *\n * @public\n */\nexport const Cluster = ({ clusterObjects, podsWithErrors }: ClusterProps) => {\n const groupedResponses = groupResponses(clusterObjects.resources);\n\n const podMetricsMap = new Map<string, ClientPodStatus[]>();\n podMetricsMap.set(clusterObjects.cluster.name, clusterObjects.podMetrics);\n return (\n <ClusterContext.Provider value={clusterObjects.cluster}>\n <GroupedResponsesContext.Provider value={groupedResponses}>\n <PodMetricsContext.Provider value={podMetricsMap}>\n <PodNamesWithErrorsContext.Provider value={podsWithErrors}>\n <Accordion TransitionProps={{ unmountOnExit: true }}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <ClusterSummary\n clusterName={clusterObjects.cluster.name}\n totalNumberOfPods={groupedResponses.pods.length}\n numberOfPodsWithErrors={podsWithErrors.size}\n />\n </AccordionSummary>\n <AccordionDetails>\n <Grid container direction=\"column\">\n {groupedResponses.customResources.length > 0 ? (\n <Grid item>\n <CustomResources />\n </Grid>\n ) : undefined}\n {groupedResponses.deployments.length > 0 ? (\n <Grid item>\n <DeploymentsAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.statefulsets.length > 0 ? (\n <Grid item>\n <StatefulSetsAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.ingresses.length > 0 ? (\n <Grid item>\n <IngressesAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.services.length > 0 ? (\n <Grid item>\n <ServicesAccordions />\n </Grid>\n ) : undefined}\n {groupedResponses.cronJobs.length > 0 ? (\n <Grid item>\n <CronJobsAccordions />\n </Grid>\n ) : undefined}\n </Grid>\n </AccordionDetails>\n </Accordion>\n </PodNamesWithErrorsContext.Provider>\n </PodMetricsContext.Provider>\n </GroupedResponsesContext.Provider>\n </ClusterContext.Provider>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { Typography } from '@material-ui/core';\nimport { ClusterObjects } from '@backstage/plugin-kubernetes-common';\nimport { WarningPanel } from '@backstage/core-components';\n\nconst clustersWithErrorsToErrorMessage = (\n clustersWithErrors: ClusterObjects[],\n): React.ReactNode => {\n return clustersWithErrors.map((c, i) => {\n return (\n <div key={i}>\n <Typography variant=\"body2\">{`Cluster: ${c.cluster.name}`}</Typography>\n {c.errors.map((e, j) => {\n return (\n <Typography variant=\"body2\" key={j}>\n {e.errorType === 'FETCH_ERROR'\n ? `Error communicating with Kubernetes: ${e.errorType}, message: ${e.message}`\n : `Error fetching Kubernetes resource: '${e.resourcePath}', error: ${e.errorType}, status code: ${e.statusCode}`}\n </Typography>\n );\n })}\n <br />\n </div>\n );\n });\n};\n\n/**\n *\n *\n * @public\n */\nexport type ErrorPanelProps = {\n entityName: string;\n errorMessage?: string;\n clustersWithErrors?: ClusterObjects[];\n children?: React.ReactNode;\n};\n\n/**\n *\n *\n * @public\n */\nexport const ErrorPanel = ({\n entityName,\n errorMessage,\n clustersWithErrors,\n}: ErrorPanelProps) => (\n <WarningPanel\n title=\"There was a problem retrieving Kubernetes objects\"\n message={`There was a problem retrieving some Kubernetes resources for the entity: ${entityName}. This could mean that the Error Reporting card is not completely accurate.`}\n >\n {clustersWithErrors && (\n <div>Errors: {clustersWithErrorsToErrorMessage(clustersWithErrors)}</div>\n )}\n {errorMessage && (\n <Typography variant=\"body2\">Errors: {errorMessage}</Typography>\n )}\n </WarningPanel>\n);\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport * as React from 'react';\nimport {\n DetectedError,\n DetectedErrorsByCluster,\n} from '@backstage/plugin-kubernetes-common';\nimport { Table, TableColumn } from '@backstage/core-components';\n\n/**\n *\n *\n * @public\n */\nexport type ErrorReportingProps = {\n detectedErrors: DetectedErrorsByCluster;\n};\n\nconst columns: TableColumn<Row>[] = [\n {\n title: 'cluster',\n width: '10%',\n render: (row: Row) => row.clusterName,\n },\n {\n title: 'namespace',\n width: '10%',\n render: (row: Row) => row.error.sourceRef.namespace,\n },\n {\n title: 'kind',\n width: '10%',\n render: (row: Row) => row.error.sourceRef.kind,\n },\n {\n title: 'name',\n width: '30%',\n render: (row: Row) => {\n return <>{row.error.sourceRef.name} </>;\n },\n },\n {\n title: 'messages',\n width: '40%',\n render: (row: Row) => row.error.message,\n },\n];\n\ninterface Row {\n clusterName: string;\n error: DetectedError;\n}\n\nconst sortBySeverity = (a: Row, b: Row) => {\n if (a.error.severity < b.error.severity) {\n return 1;\n } else if (b.error.severity < a.error.severity) {\n return -1;\n }\n return 0;\n};\n\n/**\n *\n *\n * @public\n */\nexport const ErrorReporting = ({ detectedErrors }: ErrorReportingProps) => {\n const errors = Array.from(detectedErrors.entries())\n .flatMap(([clusterName, resourceErrors]) => {\n return resourceErrors.map(e => ({\n clusterName,\n error: e,\n }));\n })\n .sort(sortBySeverity);\n\n return (\n <>\n {errors.length !== 0 && (\n <Table\n title=\"Error Reporting\"\n data={errors}\n columns={columns}\n options={{ paging: true, search: false, emptyRowsWhenPaging: false }}\n />\n )}\n </>\n );\n};\n"],"names":["__publicField","React","_a","_b","_c","_d","kindMappings","currentToDeclaredResourceToPerc","useStyles","useDrawerStyles","useDrawerContentStyles","Close","BackstageButton","withStyles","makeStyles","createStyles","Typography","Dialog","DialogTitle","IconButton","DialogContent","_e","_f","containerStatuses"],"mappings":"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"}