@backstage/plugin-kubernetes 0.9.0 → 0.9.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/api/KubernetesBackendClient.ts","../src/api/types.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/api/KubernetesProxyClient.ts","../src/plugin.ts","../src/components/ErrorPanel/ErrorPanel.tsx","../src/components/ErrorReporting/ErrorReporting.tsx","../src/utils/response.ts","../src/error-detection/common.ts","../src/error-detection/pods.ts","../src/error-detection/deployments.ts","../src/error-detection/hpas.ts","../src/error-detection/error-detection.ts","../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/hooks/auth.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/utils/clusterLinks/formatters/standard.ts","../src/utils/clusterLinks/formatters/rancher.ts","../src/utils/clusterLinks/formatters/openshift.ts","../src/utils/clusterLinks/formatters/aks.ts","../src/utils/clusterLinks/formatters/eks.ts","../src/utils/clusterLinks/formatters/gke.ts","../src/utils/clusterLinks/formatters/index.ts","../src/utils/clusterLinks/formatClusterLink.ts","../src/components/KubernetesDrawer/ManifestYaml.tsx","../src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx","../src/components/KubernetesDrawer/KubernetesDrawer.tsx","../src/components/Pods/PodDrawer/PendingPodContent.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/KubernetesContent.tsx","../src/Router.tsx"],"sourcesContent":["/*\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\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 private async getCluster(\n clusterName: string,\n ): Promise<{ name: string; authProvider: string }> {\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 ): Promise<{ token?: string }> {\n return await this.kubernetesAuthProvidersApi.getCredentials(authProvider);\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 } = await this.getCluster(options.clusterName);\n const { token: k8sToken } = await this.getCredentials(authProvider);\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}/proxy${\n options.path\n }`;\n const identityResponse = await this.identityApi.getCredentials();\n const headers = {\n ...options.init?.headers,\n [`Backstage-Kubernetes-Cluster`]: options.clusterName,\n ...(k8sToken && {\n [`Backstage-Kubernetes-Authorization`]: `Bearer ${k8sToken}`,\n }),\n ...(identityResponse.token && {\n Authorization: `Bearer ${identityResponse.token}`,\n }),\n };\n\n return await fetch(url, { ...options.init, headers });\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 KubernetesRequestBody,\n ObjectsByEntityResponse,\n WorkloadsByEntityRequest,\n CustomObjectsByEntityRequest,\n} from '@backstage/plugin-kubernetes-common';\nimport { createApiRef } from '@backstage/core-plugin-api';\n\nexport const kubernetesApiRef = createApiRef<KubernetesApi>({\n id: 'plugin.kubernetes.service',\n});\n\nexport const kubernetesProxyApiRef = createApiRef<KubernetesProxyApi>({\n id: 'plugin.kubernetes.proxy-service',\n});\n\nexport interface KubernetesApi {\n getObjectsByEntity(\n requestBody: KubernetesRequestBody,\n ): Promise<ObjectsByEntityResponse>;\n getClusters(): Promise<\n {\n name: string;\n authProvider: string;\n oidcTokenProvider?: string | undefined;\n }[]\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\nexport interface KubernetesProxyApi {\n getPodLogs(request: {\n podName: string;\n namespace: string;\n clusterName: string;\n containerName: string;\n }): Promise<{ text: 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 { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { createApiRef } from '@backstage/core-plugin-api';\n\nexport interface KubernetesAuthProvider {\n decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody>;\n getCredentials(): Promise<{ token?: string }>;\n}\n\nexport const kubernetesAuthProvidersApiRef =\n createApiRef<KubernetesAuthProvidersApi>({\n id: 'plugin.kubernetes-auth-providers.service',\n });\n\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\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',\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 { KubernetesAuthProvider } from './types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { OpenIdConnectApi } from '@backstage/core-plugin-api';\n\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 };\n if (auth.oidc) {\n auth.oidc[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\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\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 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';\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 async getPodLogs({\n podName,\n namespace,\n clusterName,\n containerName,\n }: {\n podName: string;\n namespace: string;\n clusterName: string;\n containerName: string;\n }): Promise<{ text: string }> {\n const params = new URLSearchParams({\n container: containerName,\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 { KubernetesBackendClient } from './api/KubernetesBackendClient';\nimport { kubernetesApiRef, kubernetesProxyApiRef } from './api/types';\nimport { kubernetesAuthProvidersApiRef } from './kubernetes-auth-provider/types';\nimport { KubernetesAuthProviders } from './kubernetes-auth-provider/KubernetesAuthProviders';\nimport {\n createApiFactory,\n createPlugin,\n createRouteRef,\n discoveryApiRef,\n identityApiRef,\n gitlabAuthApiRef,\n googleAuthApiRef,\n microsoftAuthApiRef,\n oktaAuthApiRef,\n oneloginAuthApiRef,\n createRoutableExtension,\n} from '@backstage/core-plugin-api';\nimport { KubernetesProxyClient } from './api';\n\nexport const rootCatalogKubernetesRouteRef = createRouteRef({\n id: 'kubernetes',\n});\n\nexport const kubernetesPlugin = createPlugin({\n id: 'kubernetes',\n apis: [\n createApiFactory({\n api: kubernetesApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n identityApi: identityApiRef,\n kubernetesAuthProvidersApi: kubernetesAuthProvidersApiRef,\n },\n factory: ({ discoveryApi, identityApi, kubernetesAuthProvidersApi }) =>\n new KubernetesBackendClient({\n discoveryApi,\n identityApi,\n kubernetesAuthProvidersApi,\n }),\n }),\n createApiFactory({\n api: kubernetesProxyApiRef,\n deps: {\n kubernetesApi: kubernetesApiRef,\n },\n factory: ({ kubernetesApi }) =>\n new KubernetesProxyClient({\n kubernetesApi,\n }),\n }),\n createApiFactory({\n api: kubernetesAuthProvidersApiRef,\n deps: {\n gitlabAuthApi: gitlabAuthApiRef,\n googleAuthApi: googleAuthApiRef,\n microsoftAuthApi: microsoftAuthApiRef,\n oktaAuthApi: oktaAuthApiRef,\n oneloginAuthApi: oneloginAuthApiRef,\n },\n factory: ({\n gitlabAuthApi,\n googleAuthApi,\n microsoftAuthApi,\n oktaAuthApi,\n oneloginAuthApi,\n }) => {\n const oidcProviders = {\n gitlab: gitlabAuthApi,\n google: googleAuthApi,\n microsoft: microsoftAuthApi,\n okta: oktaAuthApi,\n onelogin: oneloginAuthApi,\n };\n\n return new KubernetesAuthProviders({\n microsoftAuthApi,\n googleAuthApi,\n oidcProviders,\n });\n },\n }),\n ],\n routes: {\n entityContent: rootCatalogKubernetesRouteRef,\n },\n});\n\n/**\n * Props of EntityKubernetesContent\n *\n * @public\n */\nexport type EntityKubernetesContentProps = {\n /**\n * Sets the refresh interval in milliseconds. The default value is 10000 (10 seconds)\n */\n refreshIntervalMs?: number;\n};\n\nexport const EntityKubernetesContent: (\n props: EntityKubernetesContentProps,\n) => JSX.Element = kubernetesPlugin.provide(\n createRoutableExtension({\n name: 'EntityKubernetesContent',\n component: () => import('./Router').then(m => m.Router),\n mountPoint: rootCatalogKubernetesRouteRef,\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\ntype ErrorPanelProps = {\n entityName: string;\n errorMessage?: string;\n clustersWithErrors?: ClusterObjects[];\n children?: React.ReactNode;\n};\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 { DetectedError, DetectedErrorsByCluster } from '../../error-detection';\nimport { Table, TableColumn } from '@backstage/core-components';\n\ntype 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\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","/*\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 { FetchResponse } from '@backstage/plugin-kubernetes-common';\nimport { GroupedResponses } from '../types/types';\n\n// TODO this could probably be a lodash groupBy\nexport const groupResponses = (\n fetchResponse: FetchResponse[],\n): GroupedResponses => {\n return fetchResponse.reduce(\n (prev, next) => {\n switch (next.type) {\n case 'deployments':\n prev.deployments.push(...next.resources);\n break;\n case 'pods':\n prev.pods.push(...next.resources);\n break;\n case 'replicasets':\n prev.replicaSets.push(...next.resources);\n break;\n case 'services':\n prev.services.push(...next.resources);\n break;\n case 'configmaps':\n prev.configMaps.push(...next.resources);\n break;\n case 'horizontalpodautoscalers':\n prev.horizontalPodAutoscalers.push(...next.resources);\n break;\n case 'ingresses':\n prev.ingresses.push(...next.resources);\n break;\n case 'jobs':\n prev.jobs.push(...next.resources);\n break;\n case 'cronjobs':\n prev.cronJobs.push(...next.resources);\n break;\n case 'customresources':\n prev.customResources.push(...next.resources);\n break;\n case 'statefulsets':\n prev.statefulsets.push(...next.resources);\n break;\n default:\n }\n return prev;\n },\n {\n pods: [],\n replicaSets: [],\n deployments: [],\n services: [],\n configMaps: [],\n horizontalPodAutoscalers: [],\n ingresses: [],\n jobs: [],\n cronJobs: [],\n customResources: [],\n statefulsets: [],\n } as GroupedResponses,\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 { DetectedError, ErrorMapper } from './types';\n\n// Run through the each error mapper for each object\n// returning a deduplicated (mostly) result\nexport const detectErrorsInObjects = <T>(\n objects: T[],\n errorMappers: ErrorMapper<T>[],\n): DetectedError[] => {\n return objects.flatMap(o => {\n return errorMappers.flatMap(em => em.detectErrors(o));\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 { Pod, IContainerStatus, IContainer } from 'kubernetes-models/v1';\nimport { DetectedError, ErrorMapper } from './types';\nimport { detectErrorsInObjects } from './common';\nimport lodash from 'lodash';\nimport { DateTime } from 'luxon';\n\nfunction isPodReadinessProbeUnready({\n container,\n containerStatus,\n}: ContainerSpecAndStatus): boolean {\n if (\n containerStatus.ready ||\n containerStatus.state?.running?.startedAt === undefined ||\n !container.readinessProbe\n ) {\n return false;\n }\n const startDateTime = DateTime.fromISO(\n containerStatus.state?.running?.startedAt,\n )\n // Add initial delay\n .plus({\n seconds: container.readinessProbe?.initialDelaySeconds ?? 0,\n })\n // Add failure threshold\n .plus({\n seconds:\n (container.readinessProbe?.periodSeconds ?? 0) *\n (container.readinessProbe?.failureThreshold ?? 0),\n });\n return startDateTime < DateTime.now();\n}\n\ninterface ContainerSpecAndStatus {\n container: IContainer;\n containerStatus: IContainerStatus;\n}\n\nconst podToContainerSpecsAndStatuses = (pod: Pod): ContainerSpecAndStatus[] => {\n const specs = lodash.groupBy(pod.spec?.containers ?? [], value => value.name);\n\n const result: ContainerSpecAndStatus[] = [];\n\n for (const cs of pod.status?.containerStatuses ?? []) {\n const spec = specs[cs.name];\n if (spec.length > 0) {\n result.push({\n container: spec[0],\n containerStatus: cs,\n });\n }\n }\n\n return result;\n};\n\nconst podErrorMappers: ErrorMapper<Pod>[] = [\n {\n detectErrors: pod => {\n return podToContainerSpecsAndStatuses(pod)\n .filter(isPodReadinessProbeUnready)\n .map(cs => ({\n type: 'readiness-probe-taking-too-long',\n message: `The container ${cs.container.name} failed to start properly, but is not crashing`,\n severity: 4,\n proposedFix: [], // TODO next PR\n sourceRef: {\n name: pod.metadata?.name ?? 'unknown pod',\n namespace: pod.metadata?.namespace ?? 'unknown namespace',\n kind: 'Pod',\n apiGroup: 'v1',\n },\n occuranceCount: 1,\n }));\n },\n },\n {\n detectErrors: pod => {\n return (pod.status?.containerStatuses ?? [])\n .filter(cs => cs.state?.waiting?.message !== undefined)\n .map(cs => ({\n type: 'container-waiting',\n message: cs.state?.waiting?.message ?? 'container waiting',\n severity: 4,\n proposedFix: [], // TODO next PR\n sourceRef: {\n name: pod.metadata?.name ?? 'unknown pod',\n namespace: pod.metadata?.namespace ?? 'unknown namespace',\n kind: 'Pod',\n apiGroup: 'v1',\n },\n occuranceCount: 1,\n }));\n },\n },\n {\n detectErrors: pod => {\n return (pod.status?.containerStatuses ?? [])\n .filter(cs => cs.restartCount > 0)\n .map(cs => ({\n type: 'containers-restarting',\n message: `container=${cs.name} restarted ${cs.restartCount} times`,\n severity: 4,\n proposedFix: [], // TODO next PR\n sourceRef: {\n name: pod.metadata?.name ?? 'unknown pod',\n namespace: pod.metadata?.namespace ?? 'unknown namespace',\n kind: 'Pod',\n apiGroup: 'v1',\n },\n occuranceCount: cs.restartCount,\n }));\n },\n },\n];\n\nexport const detectErrorsInPods = (pods: Pod[]): DetectedError[] =>\n detectErrorsInObjects(pods, podErrorMappers);\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 { DetectedError, ErrorMapper } from './types';\nimport { Deployment } from 'kubernetes-models/apps/v1';\nimport { detectErrorsInObjects } from './common';\n\nconst deploymentErrorMappers: ErrorMapper<Deployment>[] = [\n {\n detectErrors: deployment => {\n return (deployment.status?.conditions ?? [])\n .filter(c => c.status === 'False')\n .filter(c => c.message !== undefined)\n .map(c => ({\n type: 'condition-message-present',\n message: c.message ?? '',\n severity: 6,\n proposedFix: [], // TODO next PR\n sourceRef: {\n name: deployment.metadata?.name ?? 'unknown hpa',\n namespace: deployment.metadata?.namespace ?? 'unknown namespace',\n kind: 'Deployment',\n apiGroup: 'apps/v1',\n },\n occuranceCount: 1,\n }));\n },\n },\n];\n\nexport const detectErrorsInDeployments = (\n deployments: Deployment[],\n): DetectedError[] =>\n detectErrorsInObjects(deployments, deploymentErrorMappers);\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 { HorizontalPodAutoscaler } from 'kubernetes-models/autoscaling/v1';\nimport { DetectedError, ErrorMapper } from './types';\nimport { detectErrorsInObjects } from './common';\n\nconst hpaErrorMappers: ErrorMapper<HorizontalPodAutoscaler>[] = [\n {\n detectErrors: hpa => {\n if ((hpa.spec?.maxReplicas ?? -1) === hpa.status?.currentReplicas) {\n return [\n {\n type: 'hpa-max-current-replicas',\n message: `Current number of replicas (${\n hpa.status?.currentReplicas\n }) is equal to the configured max number of replicas (${\n hpa.spec?.maxReplicas ?? -1\n })`,\n severity: 8,\n proposedFix: [], // TODO next PR\n sourceRef: {\n name: hpa.metadata?.name ?? 'unknown hpa',\n namespace: hpa.metadata?.namespace ?? 'unknown namespace',\n kind: 'HorizontalPodAutoscaler',\n apiGroup: 'autoscaling/v1',\n },\n occuranceCount: 1,\n },\n ];\n }\n return [];\n },\n },\n];\n\nexport const detectErrorsInHpa = (\n hpas: HorizontalPodAutoscaler[],\n): DetectedError[] => detectErrorsInObjects(hpas, hpaErrorMappers);\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 { DetectedError, DetectedErrorsByCluster } from './types';\nimport { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common';\nimport { groupResponses } from '../utils/response';\nimport { detectErrorsInPods } from './pods';\nimport { detectErrorsInDeployments } from './deployments';\nimport { detectErrorsInHpa } from './hpas';\nimport { Deployment } from 'kubernetes-models/apps/v1';\nimport { HorizontalPodAutoscaler } from 'kubernetes-models/autoscaling/v1';\nimport { Pod } from 'kubernetes-models/v1';\n\n/**\n * For each cluster try to find errors in each of the object types provided\n * returning a map of cluster names to errors in that cluster\n *\n * @public\n */\nexport const detectErrors = (\n objects: ObjectsByEntityResponse,\n): DetectedErrorsByCluster => {\n const errors: DetectedErrorsByCluster = new Map<string, DetectedError[]>();\n\n for (const clusterResponse of objects.items) {\n let clusterErrors: DetectedError[] = [];\n\n const groupedResponses = groupResponses(clusterResponse.resources);\n\n clusterErrors = clusterErrors.concat(\n detectErrorsInPods(groupedResponses.pods as Pod[]),\n );\n\n clusterErrors = clusterErrors.concat(\n detectErrorsInDeployments(groupedResponses.deployments as Deployment[]),\n );\n\n clusterErrors = clusterErrors.concat(\n detectErrorsInHpa(\n groupedResponses.horizontalPodAutoscalers as HorizontalPodAutoscaler[],\n ),\n );\n\n errors.set(clusterResponse.cluster.name, clusterErrors);\n }\n\n return errors;\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 { kubernetesProxyApiRef } from '@backstage/plugin-kubernetes';\nimport useAsync from 'react-use/lib/useAsync';\n\nimport { ContainerScope } from './types';\nimport { useApi } from '@backstage/core-plugin-api';\n\ninterface PodLogsOptions {\n podScope: ContainerScope;\n}\n\nexport const usePodLogs = ({ podScope }: PodLogsOptions) => {\n const kubernetesProxyApi = useApi(kubernetesProxyApiRef);\n return useAsync(async () => {\n return await kubernetesProxyApi.getPodLogs({\n podName: podScope.podName,\n namespace: podScope.podNamespace,\n containerName: podScope.containerName,\n clusterName: podScope.clusterName,\n });\n }, [JSON.stringify(podScope)]);\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 { DismissableBanner, LogViewer } 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\ninterface PodLogsProps {\n podScope: ContainerScope;\n}\n\nexport const PodLogs: React.FC<PodLogsProps> = ({ podScope }: PodLogsProps) => {\n const { value, error, loading } = usePodLogs({\n podScope: podScope,\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: '30rem' }}\n >\n {loading && <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />}\n {!loading && value !== undefined && <LogViewer text={value.text} />}\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\ninterface PodLogsDialogProps {\n podScope: ContainerScope;\n}\n\nexport const PodLogsDialog = ({ podScope }: 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 {podScope.podName} - {podScope.containerName} logs on cluster{' '}\n {podScope.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 podScope={podScope} />\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 React from 'react';\n\nimport { IContainer, IContainerStatus } from 'kubernetes-models/v1';\nimport {\n Card,\n CardActions,\n CardContent,\n CardHeader,\n Grid,\n Typography,\n} from '@material-ui/core';\n\nimport { DateTime } from 'luxon';\n\nimport { PodScope, PodLogsDialog } from '../PodLogs';\nimport { StructuredMetadataTable } from '@backstage/core-components';\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\nexport interface ContainerCardProps {\n podScope: PodScope;\n containerSpec?: IContainer;\n containerStatus: IContainerStatus;\n}\n\nexport const ContainerCard: React.FC<ContainerCardProps> = ({\n podScope,\n containerSpec,\n containerStatus,\n}: ContainerCardProps) => {\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 </Grid>\n </CardContent>\n <CardActions disableSpacing>\n <PodLogsDialog\n podScope={{\n containerName: containerStatus.name,\n ...podScope,\n }}\n />\n </CardActions>\n </Card>\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 { KubernetesApi } from '../api/types';\nimport { KubernetesAuthProvidersApi } from '../kubernetes-auth-provider/types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\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 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 { kubernetesApiRef } from '../api/types';\nimport { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider/types';\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';\n\nexport interface KubernetesObjects {\n kubernetesObjects?: ObjectsByEntityResponse;\n loading: boolean;\n error?: string;\n}\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 { kubernetesApiRef } from '../api/types';\nimport { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider/types';\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';\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\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\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 '../types/types';\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\nexport const ClusterContext = React.createContext<ClusterAttributes>({\n name: '',\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/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\nexport function standardFormatter(options: ClusterLinksFormatterOptions) {\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 * 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/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\nexport function rancherFormatter(options: ClusterLinksFormatterOptions): 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 * 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/types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployments',\n ingress: 'ingresses',\n service: 'services',\n horizontalpodautoscaler: 'horizontalpodautoscalers',\n persistentvolume: 'persistentvolumes',\n};\n\nexport function openshiftFormatter(options: ClusterLinksFormatterOptions): 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 * 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/types';\n\nconst basePath =\n 'https://portal.azure.com/#blade/Microsoft_Azure_ContainerService/AksK8ResourceMenuBlade/overview-Deployment/aksClusterId';\n\nconst requiredParams = ['subscriptionId', 'resourceGroup', 'clusterName'];\n\nexport function aksFormatter(options: ClusterLinksFormatterOptions): URL {\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 * 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/types';\n\nexport function eksFormatter(_options: ClusterLinksFormatterOptions): URL {\n throw new Error('EKS formatter is not yet implemented. Please, contribute!');\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/types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployment',\n pod: 'pod',\n ingress: 'ingress',\n service: 'service',\n horizontalpodautoscaler: 'deployment',\n};\n\nexport function gkeFormatter(options: ClusterLinksFormatterOptions): 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 = '';\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 return result;\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 { ClusterLinksFormatter } from '../../../types/types';\nimport { standardFormatter } from './standard';\nimport { rancherFormatter } from './rancher';\nimport { openshiftFormatter } from './openshift';\nimport { aksFormatter } from './aks';\nimport { eksFormatter } from './eks';\nimport { gkeFormatter } from './gke';\n\nexport const clusterLinksFormatters: Record<string, ClusterLinksFormatter> = {\n standard: standardFormatter,\n rancher: rancherFormatter,\n openshift: openshiftFormatter,\n aks: aksFormatter,\n eks: eksFormatter,\n gke: gkeFormatter,\n};\nexport const defaultFormatterName = 'standard';\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 type { JsonObject } from '@backstage/types';\nimport { defaultFormatterName, clusterLinksFormatters } from './formatters';\n\nexport type FormatClusterLinkOptions = {\n dashboardUrl?: string;\n dashboardApp?: string;\n dashboardParameters?: JsonObject;\n object: any;\n kind: string;\n};\n\nexport function 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 || defaultFormatterName;\n const formatter = clusterLinksFormatters[app];\n if (!formatter) {\n throw new Error(`Could not find Kubernetes dashboard app named '${app}'`);\n }\n const url = formatter({\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 * 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\nexport interface ManifestYamlProps {\n object: object;\n}\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 { formatClusterLink } from '../../utils/clusterLinks';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\nimport { FormatClusterLinkOptions } from '../../utils/clusterLinks/formatClusterLink';\nimport { ManifestYaml } from './ManifestYaml';\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\ntype ErrorPanelProps = {\n cluster: ClusterAttributes;\n errorMessage?: string;\n children?: React.ReactNode;\n};\n\nexport const LinkErrorPanel = ({ cluster, errorMessage }: ErrorPanelProps) => (\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\ninterface 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\nfunction tryFormatClusterLink(options: FormatClusterLinkOptions) {\n try {\n return {\n clusterLink: formatClusterLink(options),\n errorMessage: '',\n };\n } catch (err) {\n return {\n clusterLink: '',\n errorMessage: err.message || err.toString(),\n };\n }\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 classes = useDrawerContentStyles();\n const cluster = useContext(ClusterContext);\n const { clusterLink, errorMessage } = tryFormatClusterLink({\n dashboardUrl: cluster.dashboardUrl,\n dashboardApp: cluster.dashboardApp,\n dashboardParameters: cluster.dashboardParameters,\n object,\n kind,\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 {errorMessage && (\n <div className={classes.errorMessage}>\n <LinkErrorPanel cluster={cluster} errorMessage={errorMessage} />\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};\ninterface 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\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\ninterface 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\nexport const 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\ninterface 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\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\nexport const 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\ninterface PendingPodContentProps {\n pod: Pod;\n}\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 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';\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}\ninterface PodDrawerProps {\n open?: boolean;\n podAndErrors: PodAndErrors;\n}\n\nexport const PodDrawer = ({ podAndErrors, open }: PodDrawerProps) => {\n const classes = useDrawerContentStyles();\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 {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 return (\n <ContainerCard\n key={`container-card-${podAndErrors.pod.metadata?.name}-${i}`}\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 </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';\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: V1Pod): 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: V1Pod): number => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n return containerStatuses?.reduce((a, b) => a + b.restartCount, 0);\n};\n\nexport const containerStatuses = (pod: V1Pod): 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(current);\n const denominator: bigint = BigInt(resource);\n\n return `${(numerator * BigInt(100)) / denominator}%`;\n};\n\nconst formatMilicores = (value: string | number): string => {\n return `${parseFloat(value.toString()) * 1000}m`;\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 ${formatMilicores(cpuUtil.requestTotal)}`}\n subvalue={`limits: ${currentToDeclaredResourceToPerc(\n currentUsage,\n cpuUtil.limitTotal,\n )} of ${formatMilicores(cpuUtil.limitTotal)}`}\n />\n );\n};\n\nconst bytesToMiB = (value: string | number): string => {\n return `${parseFloat(value.toString()) / 1024 / 1024}MiB`;\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 { V1Pod } from '@kubernetes/client-node';\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 { PodNamesWithMetricsContext } from '../../hooks/PodNamesWithMetrics';\nimport { ClusterContext } from '../../hooks/Cluster';\n\nexport const READY_COLUMNS: PodColumns = 'READY';\nexport const RESOURCE_COLUMNS: PodColumns = 'RESOURCE';\nexport type PodColumns = 'READY' | 'RESOURCE';\n\ntype PodsTablesProps = {\n pods: V1Pod[];\n extraColumns?: PodColumns[];\n children?: React.ReactNode;\n};\n\nconst READY: TableColumn<V1Pod>[] = [\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\nexport const PodsTable = ({ pods, extraColumns = [] }: PodsTablesProps) => {\n const podNamesWithMetrics = useContext(PodNamesWithMetricsContext);\n const cluster = useContext(ClusterContext);\n const defaultColumns: TableColumn<V1Pod>[] = [\n {\n title: 'name',\n highlight: true,\n render: (pod: V1Pod) => (\n <PodDrawer\n podAndErrors={{\n pod: pod as any,\n clusterName: cluster.name,\n errors: [],\n }}\n />\n ),\n },\n {\n title: 'phase',\n render: (pod: V1Pod) => pod.status?.phase ?? 'unknown',\n width: 'auto',\n },\n {\n title: 'status',\n render: containerStatuses,\n },\n ];\n const columns: TableColumn<V1Pod>[] = [...defaultColumns];\n\n if (extraColumns.includes(READY_COLUMNS)) {\n columns.push(...READY);\n }\n if (extraColumns.includes(RESOURCE_COLUMNS)) {\n const resourceColumns: TableColumn<V1Pod>[] = [\n {\n title: 'CPU usage %',\n render: (pod: V1Pod) => {\n const metrics = podNamesWithMetrics.get(pod.metadata?.name ?? '');\n\n if (!metrics) {\n return 'unknown';\n }\n\n return podStatusToCpuUtil(metrics);\n },\n width: 'auto',\n },\n {\n title: 'Memory usage %',\n render: (pod: V1Pod) => {\n const metrics = podNamesWithMetrics.get(pod.metadata?.name ?? '');\n\n if (!metrics) {\n return 'unknown';\n }\n\n return podStatusToMemoryUtil(metrics);\n },\n width: 'auto',\n },\n ];\n columns.push(...resourceColumns);\n }\n\n const tableStyle = {\n minWidth: '0',\n width: '100%',\n };\n\n const usePods = pods.map(p => ({ ...p, id: p.metadata?.uid }));\n\n return (\n <div style={tableStyle}>\n <Table\n options={{ paging: true, search: false, emptyRowsWhenPaging: false }}\n data={usePods}\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\ntype 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};\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\ntype 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\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\ntype 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\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\ntype 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\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 {customResource.hasOwnProperty('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\ninterface 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\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} from '@backstage/plugin-kubernetes-common';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { DeploymentsAccordions } from '../DeploymentsAccordions';\nimport { StatefulSetsAccordions } from '../StatefulSetsAccordions';\nimport { groupResponses } from '../../utils/response';\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 { PodNamesWithMetricsContext } from '../../hooks/PodNamesWithMetrics';\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\ntype ClusterProps = {\n clusterObjects: ClusterObjects;\n podsWithErrors: Set<string>;\n children?: React.ReactNode;\n};\n\nexport const Cluster = ({ clusterObjects, podsWithErrors }: ClusterProps) => {\n const groupedResponses = groupResponses(clusterObjects.resources);\n const podNameToMetrics = clusterObjects.podMetrics\n .flat()\n .reduce((accum, next) => {\n const name = next.pod.metadata?.name;\n if (name !== undefined) {\n accum.set(name, next);\n }\n return accum;\n }, new Map<string, ClientPodStatus>());\n return (\n <ClusterContext.Provider value={clusterObjects.cluster}>\n <GroupedResponsesContext.Provider value={groupedResponses}>\n <PodNamesWithMetricsContext.Provider value={podNameToMetrics}>\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 </PodNamesWithMetricsContext.Provider>\n </GroupedResponsesContext.Provider>\n </ClusterContext.Provider>\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 { Grid, Typography } from '@material-ui/core';\nimport { Entity } from '@backstage/catalog-model';\nimport { ErrorPanel } from './ErrorPanel';\nimport { ErrorReporting } from './ErrorReporting';\nimport { DetectedError, detectErrors } from '../error-detection';\nimport { Cluster } from './Cluster';\nimport EmptyStateImage from '../assets/emptystate.svg';\nimport { useKubernetesObjects } from '../hooks';\nimport { Content, Page, Progress } from '@backstage/core-components';\n\ntype KubernetesContentProps = {\n entity: Entity;\n refreshIntervalMs?: number;\n children?: React.ReactNode;\n};\n\nexport const KubernetesContent = ({\n entity,\n refreshIntervalMs,\n}: KubernetesContentProps) => {\n const { kubernetesObjects, error } = useKubernetesObjects(\n entity,\n refreshIntervalMs,\n );\n\n const clustersWithErrors =\n kubernetesObjects?.items.filter(r => r.errors.length > 0) ?? [];\n\n const detectedErrors =\n kubernetesObjects !== undefined\n ? detectErrors(kubernetesObjects)\n : new Map<string, DetectedError[]>();\n\n return (\n <Page themeId=\"tool\">\n <Content>\n {kubernetesObjects === undefined && error === undefined && <Progress />}\n\n {/* errors retrieved from the kubernetes clusters */}\n {clustersWithErrors.length > 0 && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ErrorPanel\n entityName={entity.metadata.name}\n clustersWithErrors={clustersWithErrors}\n />\n </Grid>\n </Grid>\n )}\n\n {/* other errors */}\n {error !== undefined && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ErrorPanel\n entityName={entity.metadata.name}\n errorMessage={error}\n />\n </Grid>\n </Grid>\n )}\n\n {kubernetesObjects && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ErrorReporting detectedErrors={detectedErrors} />\n </Grid>\n <Grid item>\n <Typography variant=\"h3\">Your Clusters</Typography>\n </Grid>\n <Grid item container>\n {kubernetesObjects?.items.length <= 0 && (\n <Grid\n container\n justifyContent=\"space-around\"\n direction=\"row\"\n alignItems=\"center\"\n spacing={2}\n >\n <Grid item xs={4}>\n <Typography variant=\"h5\">\n No resources on any known clusters for{' '}\n {entity.metadata.name}\n </Typography>\n </Grid>\n <Grid item xs={4}>\n <img\n src={EmptyStateImage}\n alt=\"EmptyState\"\n data-testid=\"emptyStateImg\"\n />\n </Grid>\n </Grid>\n )}\n {kubernetesObjects?.items.length > 0 &&\n kubernetesObjects?.items.map((item, i) => {\n const podsWithErrors = new Set<string>(\n detectedErrors\n .get(item.cluster.name)\n ?.filter(de => de.sourceRef.kind === 'Pod')\n .map(de => de.sourceRef.name),\n );\n\n return (\n <Grid item key={i} xs={12}>\n <Cluster\n clusterObjects={item}\n podsWithErrors={podsWithErrors}\n />\n </Grid>\n );\n })}\n </Grid>\n </Grid>\n )}\n </Content>\n </Page>\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 { Entity } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { Route, Routes } from 'react-router-dom';\nimport { KubernetesContent } from './components/KubernetesContent';\nimport { Button } from '@material-ui/core';\nimport { MissingAnnotationEmptyState } from '@backstage/core-components';\n\nconst KUBERNETES_ANNOTATION = 'backstage.io/kubernetes-id';\nconst KUBERNETES_LABEL_SELECTOR_QUERY_ANNOTATION =\n 'backstage.io/kubernetes-label-selector';\n\nexport const isKubernetesAvailable = (entity: Entity) =>\n Boolean(entity.metadata.annotations?.[KUBERNETES_ANNOTATION]) ||\n Boolean(\n entity.metadata.annotations?.[KUBERNETES_LABEL_SELECTOR_QUERY_ANNOTATION],\n );\n\nexport const Router = (props: { refreshIntervalMs?: number }) => {\n const { entity } = useEntity();\n\n const kubernetesAnnotationValue =\n entity.metadata.annotations?.[KUBERNETES_ANNOTATION];\n\n const kubernetesLabelSelectorQueryAnnotationValue =\n entity.metadata.annotations?.[KUBERNETES_LABEL_SELECTOR_QUERY_ANNOTATION];\n\n if (\n kubernetesAnnotationValue ||\n kubernetesLabelSelectorQueryAnnotationValue\n ) {\n return (\n <Routes>\n <Route\n path=\"/\"\n element={\n <KubernetesContent\n entity={entity}\n refreshIntervalMs={props.refreshIntervalMs}\n />\n }\n />\n </Routes>\n );\n }\n\n return (\n <>\n <MissingAnnotationEmptyState annotation={KUBERNETES_ANNOTATION} />\n <h1>\n Or use a label selector query, which takes precedence over the previous\n annotation.\n </h1>\n <Button\n variant=\"contained\"\n color=\"primary\"\n href=\"https://backstage.io/docs/features/kubernetes/configuration#surfacing-your-kubernetes-components-as-part-of-an-entity\"\n >\n Read Kubernetes Plugin Docs\n </Button>\n </>\n );\n};\n"],"names":["React","_a","_b","kubernetesProxyApiRef","kindMappings","useDrawerStyles","useDrawerContentStyles","Close","BackstageButton","withStyles","_c","_d","_e","containerStatuses","Typography"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/api/KubernetesBackendClient.ts","../src/api/types.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/api/KubernetesProxyClient.ts","../src/plugin.ts","../src/components/ErrorPanel/ErrorPanel.tsx","../src/components/ErrorReporting/ErrorReporting.tsx","../src/utils/response.ts","../src/error-detection/common.ts","../src/error-detection/pods.ts","../src/error-detection/deployments.ts","../src/error-detection/hpas.ts","../src/error-detection/error-detection.ts","../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/hooks/auth.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/utils/clusterLinks/formatters/standard.ts","../src/utils/clusterLinks/formatters/rancher.ts","../src/utils/clusterLinks/formatters/openshift.ts","../src/utils/clusterLinks/formatters/aks.ts","../src/utils/clusterLinks/formatters/eks.ts","../src/utils/clusterLinks/formatters/gke.ts","../src/utils/clusterLinks/formatters/index.ts","../src/utils/clusterLinks/formatClusterLink.ts","../src/components/KubernetesDrawer/ManifestYaml.tsx","../src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx","../src/components/KubernetesDrawer/KubernetesDrawer.tsx","../src/components/Pods/PodDrawer/PendingPodContent.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/KubernetesContent.tsx","../src/Router.tsx"],"sourcesContent":["/*\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\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 private async getCluster(\n clusterName: string,\n ): Promise<{ name: string; authProvider: string }> {\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 ): Promise<{ token?: string }> {\n return await this.kubernetesAuthProvidersApi.getCredentials(authProvider);\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 } = await this.getCluster(options.clusterName);\n const { token: k8sToken } = await this.getCredentials(authProvider);\n const url = `${await this.discoveryApi.getBaseUrl('kubernetes')}/proxy${\n options.path\n }`;\n const identityResponse = await this.identityApi.getCredentials();\n const headers = {\n ...options.init?.headers,\n [`Backstage-Kubernetes-Cluster`]: options.clusterName,\n ...(k8sToken && {\n [`Backstage-Kubernetes-Authorization`]: `Bearer ${k8sToken}`,\n }),\n ...(identityResponse.token && {\n Authorization: `Bearer ${identityResponse.token}`,\n }),\n };\n\n return await fetch(url, { ...options.init, headers });\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 KubernetesRequestBody,\n ObjectsByEntityResponse,\n WorkloadsByEntityRequest,\n CustomObjectsByEntityRequest,\n} from '@backstage/plugin-kubernetes-common';\nimport { createApiRef } from '@backstage/core-plugin-api';\n\nexport const kubernetesApiRef = createApiRef<KubernetesApi>({\n id: 'plugin.kubernetes.service',\n});\n\nexport const kubernetesProxyApiRef = createApiRef<KubernetesProxyApi>({\n id: 'plugin.kubernetes.proxy-service',\n});\n\nexport interface KubernetesApi {\n getObjectsByEntity(\n requestBody: KubernetesRequestBody,\n ): Promise<ObjectsByEntityResponse>;\n getClusters(): Promise<\n {\n name: string;\n authProvider: string;\n oidcTokenProvider?: string | undefined;\n }[]\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\nexport interface KubernetesProxyApi {\n getPodLogs(request: {\n podName: string;\n namespace: string;\n clusterName: string;\n containerName: string;\n }): Promise<{ text: 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 { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { createApiRef } from '@backstage/core-plugin-api';\n\nexport interface KubernetesAuthProvider {\n decorateRequestBodyForAuth(\n requestBody: KubernetesRequestBody,\n ): Promise<KubernetesRequestBody>;\n getCredentials(): Promise<{ token?: string }>;\n}\n\nexport const kubernetesAuthProvidersApiRef =\n createApiRef<KubernetesAuthProvidersApi>({\n id: 'plugin.kubernetes-auth-providers.service',\n });\n\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\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',\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 { KubernetesAuthProvider } from './types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\nimport { OpenIdConnectApi } from '@backstage/core-plugin-api';\n\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 };\n if (auth.oidc) {\n auth.oidc[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\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\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 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';\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 async getPodLogs({\n podName,\n namespace,\n clusterName,\n containerName,\n }: {\n podName: string;\n namespace: string;\n clusterName: string;\n containerName: string;\n }): Promise<{ text: string }> {\n const params = new URLSearchParams({\n container: containerName,\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 { KubernetesBackendClient } from './api/KubernetesBackendClient';\nimport { kubernetesApiRef, kubernetesProxyApiRef } from './api/types';\nimport { kubernetesAuthProvidersApiRef } from './kubernetes-auth-provider/types';\nimport { KubernetesAuthProviders } from './kubernetes-auth-provider/KubernetesAuthProviders';\nimport {\n createApiFactory,\n createPlugin,\n createRouteRef,\n discoveryApiRef,\n identityApiRef,\n gitlabAuthApiRef,\n googleAuthApiRef,\n microsoftAuthApiRef,\n oktaAuthApiRef,\n oneloginAuthApiRef,\n createRoutableExtension,\n} from '@backstage/core-plugin-api';\nimport { KubernetesProxyClient } from './api';\n\nexport const rootCatalogKubernetesRouteRef = createRouteRef({\n id: 'kubernetes',\n});\n\nexport const kubernetesPlugin = createPlugin({\n id: 'kubernetes',\n apis: [\n createApiFactory({\n api: kubernetesApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n identityApi: identityApiRef,\n kubernetesAuthProvidersApi: kubernetesAuthProvidersApiRef,\n },\n factory: ({ discoveryApi, identityApi, kubernetesAuthProvidersApi }) =>\n new KubernetesBackendClient({\n discoveryApi,\n identityApi,\n kubernetesAuthProvidersApi,\n }),\n }),\n createApiFactory({\n api: kubernetesProxyApiRef,\n deps: {\n kubernetesApi: kubernetesApiRef,\n },\n factory: ({ kubernetesApi }) =>\n new KubernetesProxyClient({\n kubernetesApi,\n }),\n }),\n createApiFactory({\n api: kubernetesAuthProvidersApiRef,\n deps: {\n gitlabAuthApi: gitlabAuthApiRef,\n googleAuthApi: googleAuthApiRef,\n microsoftAuthApi: microsoftAuthApiRef,\n oktaAuthApi: oktaAuthApiRef,\n oneloginAuthApi: oneloginAuthApiRef,\n },\n factory: ({\n gitlabAuthApi,\n googleAuthApi,\n microsoftAuthApi,\n oktaAuthApi,\n oneloginAuthApi,\n }) => {\n const oidcProviders = {\n gitlab: gitlabAuthApi,\n google: googleAuthApi,\n microsoft: microsoftAuthApi,\n okta: oktaAuthApi,\n onelogin: oneloginAuthApi,\n };\n\n return new KubernetesAuthProviders({\n microsoftAuthApi,\n googleAuthApi,\n oidcProviders,\n });\n },\n }),\n ],\n routes: {\n entityContent: rootCatalogKubernetesRouteRef,\n },\n});\n\n/**\n * Props of EntityKubernetesContent\n *\n * @public\n */\nexport type EntityKubernetesContentProps = {\n /**\n * Sets the refresh interval in milliseconds. The default value is 10000 (10 seconds)\n */\n refreshIntervalMs?: number;\n};\n\nexport const EntityKubernetesContent: (\n props: EntityKubernetesContentProps,\n) => JSX.Element = kubernetesPlugin.provide(\n createRoutableExtension({\n name: 'EntityKubernetesContent',\n component: () => import('./Router').then(m => m.Router),\n mountPoint: rootCatalogKubernetesRouteRef,\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\ntype ErrorPanelProps = {\n entityName: string;\n errorMessage?: string;\n clustersWithErrors?: ClusterObjects[];\n children?: React.ReactNode;\n};\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 { DetectedError, DetectedErrorsByCluster } from '../../error-detection';\nimport { Table, TableColumn } from '@backstage/core-components';\n\ntype 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\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","/*\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 { FetchResponse } from '@backstage/plugin-kubernetes-common';\nimport { GroupedResponses } from '../types/types';\n\n// TODO this could probably be a lodash groupBy\nexport const groupResponses = (\n fetchResponse: FetchResponse[],\n): GroupedResponses => {\n return fetchResponse.reduce(\n (prev, next) => {\n switch (next.type) {\n case 'deployments':\n prev.deployments.push(...next.resources);\n break;\n case 'pods':\n prev.pods.push(...next.resources);\n break;\n case 'replicasets':\n prev.replicaSets.push(...next.resources);\n break;\n case 'services':\n prev.services.push(...next.resources);\n break;\n case 'configmaps':\n prev.configMaps.push(...next.resources);\n break;\n case 'horizontalpodautoscalers':\n prev.horizontalPodAutoscalers.push(...next.resources);\n break;\n case 'ingresses':\n prev.ingresses.push(...next.resources);\n break;\n case 'jobs':\n prev.jobs.push(...next.resources);\n break;\n case 'cronjobs':\n prev.cronJobs.push(...next.resources);\n break;\n case 'customresources':\n prev.customResources.push(...next.resources);\n break;\n case 'statefulsets':\n prev.statefulsets.push(...next.resources);\n break;\n default:\n }\n return prev;\n },\n {\n pods: [],\n replicaSets: [],\n deployments: [],\n services: [],\n configMaps: [],\n horizontalPodAutoscalers: [],\n ingresses: [],\n jobs: [],\n cronJobs: [],\n customResources: [],\n statefulsets: [],\n } as GroupedResponses,\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 { DetectedError, ErrorMapper } from './types';\n\n// Run through the each error mapper for each object\n// returning a deduplicated (mostly) result\nexport const detectErrorsInObjects = <T>(\n objects: T[],\n errorMappers: ErrorMapper<T>[],\n): DetectedError[] => {\n return objects.flatMap(o => {\n return errorMappers.flatMap(em => em.detectErrors(o));\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 { Pod, IContainerStatus, IContainer } from 'kubernetes-models/v1';\nimport { DetectedError, ErrorMapper } from './types';\nimport { detectErrorsInObjects } from './common';\nimport lodash from 'lodash';\nimport { DateTime } from 'luxon';\n\nfunction isPodReadinessProbeUnready({\n container,\n containerStatus,\n}: ContainerSpecAndStatus): boolean {\n if (\n containerStatus.ready ||\n containerStatus.state?.running?.startedAt === undefined ||\n !container.readinessProbe\n ) {\n return false;\n }\n const startDateTime = DateTime.fromISO(\n containerStatus.state?.running?.startedAt,\n )\n // Add initial delay\n .plus({\n seconds: container.readinessProbe?.initialDelaySeconds ?? 0,\n })\n // Add failure threshold\n .plus({\n seconds:\n (container.readinessProbe?.periodSeconds ?? 0) *\n (container.readinessProbe?.failureThreshold ?? 0),\n });\n return startDateTime < DateTime.now();\n}\n\ninterface ContainerSpecAndStatus {\n container: IContainer;\n containerStatus: IContainerStatus;\n}\n\nconst podToContainerSpecsAndStatuses = (pod: Pod): ContainerSpecAndStatus[] => {\n const specs = lodash.groupBy(pod.spec?.containers ?? [], value => value.name);\n\n const result: ContainerSpecAndStatus[] = [];\n\n for (const cs of pod.status?.containerStatuses ?? []) {\n const spec = specs[cs.name];\n if (spec.length > 0) {\n result.push({\n container: spec[0],\n containerStatus: cs,\n });\n }\n }\n\n return result;\n};\n\nconst podErrorMappers: ErrorMapper<Pod>[] = [\n {\n detectErrors: pod => {\n return podToContainerSpecsAndStatuses(pod)\n .filter(isPodReadinessProbeUnready)\n .map(cs => ({\n type: 'readiness-probe-taking-too-long',\n message: `The container ${cs.container.name} failed to start properly, but is not crashing`,\n severity: 4,\n proposedFix: [], // TODO next PR\n sourceRef: {\n name: pod.metadata?.name ?? 'unknown pod',\n namespace: pod.metadata?.namespace ?? 'unknown namespace',\n kind: 'Pod',\n apiGroup: 'v1',\n },\n occuranceCount: 1,\n }));\n },\n },\n {\n detectErrors: pod => {\n return (pod.status?.containerStatuses ?? [])\n .filter(cs => cs.state?.waiting?.message !== undefined)\n .map(cs => ({\n type: 'container-waiting',\n message: cs.state?.waiting?.message ?? 'container waiting',\n severity: 4,\n proposedFix: [], // TODO next PR\n sourceRef: {\n name: pod.metadata?.name ?? 'unknown pod',\n namespace: pod.metadata?.namespace ?? 'unknown namespace',\n kind: 'Pod',\n apiGroup: 'v1',\n },\n occuranceCount: 1,\n }));\n },\n },\n {\n detectErrors: pod => {\n return (pod.status?.containerStatuses ?? [])\n .filter(cs => cs.restartCount > 0)\n .map(cs => ({\n type: 'containers-restarting',\n message: `container=${cs.name} restarted ${cs.restartCount} times`,\n severity: 4,\n proposedFix: [], // TODO next PR\n sourceRef: {\n name: pod.metadata?.name ?? 'unknown pod',\n namespace: pod.metadata?.namespace ?? 'unknown namespace',\n kind: 'Pod',\n apiGroup: 'v1',\n },\n occuranceCount: cs.restartCount,\n }));\n },\n },\n];\n\nexport const detectErrorsInPods = (pods: Pod[]): DetectedError[] =>\n detectErrorsInObjects(pods, podErrorMappers);\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 { DetectedError, ErrorMapper } from './types';\nimport { Deployment } from 'kubernetes-models/apps/v1';\nimport { detectErrorsInObjects } from './common';\n\nconst deploymentErrorMappers: ErrorMapper<Deployment>[] = [\n {\n detectErrors: deployment => {\n return (deployment.status?.conditions ?? [])\n .filter(c => c.status === 'False')\n .filter(c => c.message !== undefined)\n .map(c => ({\n type: 'condition-message-present',\n message: c.message ?? '',\n severity: 6,\n proposedFix: [], // TODO next PR\n sourceRef: {\n name: deployment.metadata?.name ?? 'unknown hpa',\n namespace: deployment.metadata?.namespace ?? 'unknown namespace',\n kind: 'Deployment',\n apiGroup: 'apps/v1',\n },\n occuranceCount: 1,\n }));\n },\n },\n];\n\nexport const detectErrorsInDeployments = (\n deployments: Deployment[],\n): DetectedError[] =>\n detectErrorsInObjects(deployments, deploymentErrorMappers);\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 { HorizontalPodAutoscaler } from 'kubernetes-models/autoscaling/v1';\nimport { DetectedError, ErrorMapper } from './types';\nimport { detectErrorsInObjects } from './common';\n\nconst hpaErrorMappers: ErrorMapper<HorizontalPodAutoscaler>[] = [\n {\n detectErrors: hpa => {\n if ((hpa.spec?.maxReplicas ?? -1) === hpa.status?.currentReplicas) {\n return [\n {\n type: 'hpa-max-current-replicas',\n message: `Current number of replicas (${\n hpa.status?.currentReplicas\n }) is equal to the configured max number of replicas (${\n hpa.spec?.maxReplicas ?? -1\n })`,\n severity: 8,\n proposedFix: [], // TODO next PR\n sourceRef: {\n name: hpa.metadata?.name ?? 'unknown hpa',\n namespace: hpa.metadata?.namespace ?? 'unknown namespace',\n kind: 'HorizontalPodAutoscaler',\n apiGroup: 'autoscaling/v1',\n },\n occuranceCount: 1,\n },\n ];\n }\n return [];\n },\n },\n];\n\nexport const detectErrorsInHpa = (\n hpas: HorizontalPodAutoscaler[],\n): DetectedError[] => detectErrorsInObjects(hpas, hpaErrorMappers);\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 { DetectedError, DetectedErrorsByCluster } from './types';\nimport { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common';\nimport { groupResponses } from '../utils/response';\nimport { detectErrorsInPods } from './pods';\nimport { detectErrorsInDeployments } from './deployments';\nimport { detectErrorsInHpa } from './hpas';\nimport { Deployment } from 'kubernetes-models/apps/v1';\nimport { HorizontalPodAutoscaler } from 'kubernetes-models/autoscaling/v1';\nimport { Pod } from 'kubernetes-models/v1';\n\n/**\n * For each cluster try to find errors in each of the object types provided\n * returning a map of cluster names to errors in that cluster\n *\n * @public\n */\nexport const detectErrors = (\n objects: ObjectsByEntityResponse,\n): DetectedErrorsByCluster => {\n const errors: DetectedErrorsByCluster = new Map<string, DetectedError[]>();\n\n for (const clusterResponse of objects.items) {\n let clusterErrors: DetectedError[] = [];\n\n const groupedResponses = groupResponses(clusterResponse.resources);\n\n clusterErrors = clusterErrors.concat(\n detectErrorsInPods(groupedResponses.pods as Pod[]),\n );\n\n clusterErrors = clusterErrors.concat(\n detectErrorsInDeployments(groupedResponses.deployments as Deployment[]),\n );\n\n clusterErrors = clusterErrors.concat(\n detectErrorsInHpa(\n groupedResponses.horizontalPodAutoscalers as HorizontalPodAutoscaler[],\n ),\n );\n\n errors.set(clusterResponse.cluster.name, clusterErrors);\n }\n\n return errors;\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';\n\ninterface PodLogsOptions {\n podScope: ContainerScope;\n}\n\nexport const usePodLogs = ({ podScope }: PodLogsOptions) => {\n const kubernetesProxyApi = useApi(kubernetesProxyApiRef);\n return useAsync(async () => {\n return await kubernetesProxyApi.getPodLogs({\n podName: podScope.podName,\n namespace: podScope.podNamespace,\n containerName: podScope.containerName,\n clusterName: podScope.clusterName,\n });\n }, [JSON.stringify(podScope)]);\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 { DismissableBanner, LogViewer } 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\ninterface PodLogsProps {\n podScope: ContainerScope;\n}\n\nexport const PodLogs: React.FC<PodLogsProps> = ({ podScope }: PodLogsProps) => {\n const { value, error, loading } = usePodLogs({\n podScope: podScope,\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: '30rem' }}\n >\n {loading && <Skeleton variant=\"rect\" width=\"100%\" height=\"100%\" />}\n {!loading && value !== undefined && <LogViewer text={value.text} />}\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\ninterface PodLogsDialogProps {\n podScope: ContainerScope;\n}\n\nexport const PodLogsDialog = ({ podScope }: 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 {podScope.podName} - {podScope.containerName} logs on cluster{' '}\n {podScope.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 podScope={podScope} />\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 React from 'react';\n\nimport { IContainer, IContainerStatus } from 'kubernetes-models/v1';\nimport {\n Card,\n CardActions,\n CardContent,\n CardHeader,\n Grid,\n Typography,\n} from '@material-ui/core';\n\nimport { DateTime } from 'luxon';\n\nimport { PodScope, PodLogsDialog } from '../PodLogs';\nimport { StructuredMetadataTable } from '@backstage/core-components';\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\nexport interface ContainerCardProps {\n podScope: PodScope;\n containerSpec?: IContainer;\n containerStatus: IContainerStatus;\n}\n\nexport const ContainerCard: React.FC<ContainerCardProps> = ({\n podScope,\n containerSpec,\n containerStatus,\n}: ContainerCardProps) => {\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 </Grid>\n </CardContent>\n <CardActions disableSpacing>\n <PodLogsDialog\n podScope={{\n containerName: containerStatus.name,\n ...podScope,\n }}\n />\n </CardActions>\n </Card>\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 { KubernetesApi } from '../api/types';\nimport { KubernetesAuthProvidersApi } from '../kubernetes-auth-provider/types';\nimport { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common';\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 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 { kubernetesApiRef } from '../api/types';\nimport { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider/types';\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';\n\nexport interface KubernetesObjects {\n kubernetesObjects?: ObjectsByEntityResponse;\n loading: boolean;\n error?: string;\n}\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 { kubernetesApiRef } from '../api/types';\nimport { kubernetesAuthProvidersApiRef } from '../kubernetes-auth-provider/types';\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';\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\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\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 '../types/types';\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\nexport const ClusterContext = React.createContext<ClusterAttributes>({\n name: '',\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/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\nexport function standardFormatter(options: ClusterLinksFormatterOptions) {\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 * 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/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\nexport function rancherFormatter(options: ClusterLinksFormatterOptions): 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 * 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/types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployments',\n ingress: 'ingresses',\n service: 'services',\n horizontalpodautoscaler: 'horizontalpodautoscalers',\n persistentvolume: 'persistentvolumes',\n};\n\nexport function openshiftFormatter(options: ClusterLinksFormatterOptions): 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 * 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/types';\n\nconst basePath =\n 'https://portal.azure.com/#blade/Microsoft_Azure_ContainerService/AksK8ResourceMenuBlade/overview-Deployment/aksClusterId';\n\nconst requiredParams = ['subscriptionId', 'resourceGroup', 'clusterName'];\n\nexport function aksFormatter(options: ClusterLinksFormatterOptions): URL {\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 * 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/types';\n\nexport function eksFormatter(_options: ClusterLinksFormatterOptions): URL {\n throw new Error('EKS formatter is not yet implemented. Please, contribute!');\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/types';\n\nconst kindMappings: Record<string, string> = {\n deployment: 'deployment',\n pod: 'pod',\n ingress: 'ingress',\n service: 'service',\n horizontalpodautoscaler: 'deployment',\n};\n\nexport function gkeFormatter(options: ClusterLinksFormatterOptions): 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 = '';\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 return result;\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 { ClusterLinksFormatter } from '../../../types/types';\nimport { standardFormatter } from './standard';\nimport { rancherFormatter } from './rancher';\nimport { openshiftFormatter } from './openshift';\nimport { aksFormatter } from './aks';\nimport { eksFormatter } from './eks';\nimport { gkeFormatter } from './gke';\n\nexport const clusterLinksFormatters: Record<string, ClusterLinksFormatter> = {\n standard: standardFormatter,\n rancher: rancherFormatter,\n openshift: openshiftFormatter,\n aks: aksFormatter,\n eks: eksFormatter,\n gke: gkeFormatter,\n};\nexport const defaultFormatterName = 'standard';\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 type { JsonObject } from '@backstage/types';\nimport { defaultFormatterName, clusterLinksFormatters } from './formatters';\n\nexport type FormatClusterLinkOptions = {\n dashboardUrl?: string;\n dashboardApp?: string;\n dashboardParameters?: JsonObject;\n object: any;\n kind: string;\n};\n\nexport function 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 || defaultFormatterName;\n const formatter = clusterLinksFormatters[app];\n if (!formatter) {\n throw new Error(`Could not find Kubernetes dashboard app named '${app}'`);\n }\n const url = formatter({\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 * 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\nexport interface ManifestYamlProps {\n object: object;\n}\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 { formatClusterLink } from '../../utils/clusterLinks';\nimport { ClusterAttributes } from '@backstage/plugin-kubernetes-common';\nimport { FormatClusterLinkOptions } from '../../utils/clusterLinks/formatClusterLink';\nimport { ManifestYaml } from './ManifestYaml';\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\ntype ErrorPanelProps = {\n cluster: ClusterAttributes;\n errorMessage?: string;\n children?: React.ReactNode;\n};\n\nexport const LinkErrorPanel = ({ cluster, errorMessage }: ErrorPanelProps) => (\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\ninterface 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\nfunction tryFormatClusterLink(options: FormatClusterLinkOptions) {\n try {\n return {\n clusterLink: formatClusterLink(options),\n errorMessage: '',\n };\n } catch (err) {\n return {\n clusterLink: '',\n errorMessage: err.message || err.toString(),\n };\n }\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 classes = useDrawerContentStyles();\n const cluster = useContext(ClusterContext);\n const { clusterLink, errorMessage } = tryFormatClusterLink({\n dashboardUrl: cluster.dashboardUrl,\n dashboardApp: cluster.dashboardApp,\n dashboardParameters: cluster.dashboardParameters,\n object,\n kind,\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 {errorMessage && (\n <div className={classes.errorMessage}>\n <LinkErrorPanel cluster={cluster} errorMessage={errorMessage} />\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};\ninterface 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\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\ninterface 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\nexport const 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\ninterface 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\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\nexport const 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\ninterface PendingPodContentProps {\n pod: Pod;\n}\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 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';\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}\ninterface PodDrawerProps {\n open?: boolean;\n podAndErrors: PodAndErrors;\n}\n\nexport const PodDrawer = ({ podAndErrors, open }: PodDrawerProps) => {\n const classes = useDrawerContentStyles();\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 {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 return (\n <ContainerCard\n key={`container-card-${podAndErrors.pod.metadata?.name}-${i}`}\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 </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';\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: V1Pod): 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: V1Pod): number => {\n const containerStatuses = pod.status?.containerStatuses ?? [];\n return containerStatuses?.reduce((a, b) => a + b.restartCount, 0);\n};\n\nexport const containerStatuses = (pod: V1Pod): 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(current);\n const denominator: bigint = BigInt(resource);\n\n return `${(numerator * BigInt(100)) / denominator}%`;\n};\n\nconst formatMilicores = (value: string | number): string => {\n return `${parseFloat(value.toString()) * 1000}m`;\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 ${formatMilicores(cpuUtil.requestTotal)}`}\n subvalue={`limits: ${currentToDeclaredResourceToPerc(\n currentUsage,\n cpuUtil.limitTotal,\n )} of ${formatMilicores(cpuUtil.limitTotal)}`}\n />\n );\n};\n\nconst bytesToMiB = (value: string | number): string => {\n return `${parseFloat(value.toString()) / 1024 / 1024}MiB`;\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 { V1Pod } from '@kubernetes/client-node';\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 { PodNamesWithMetricsContext } from '../../hooks/PodNamesWithMetrics';\nimport { ClusterContext } from '../../hooks/Cluster';\n\nexport const READY_COLUMNS: PodColumns = 'READY';\nexport const RESOURCE_COLUMNS: PodColumns = 'RESOURCE';\nexport type PodColumns = 'READY' | 'RESOURCE';\n\ntype PodsTablesProps = {\n pods: V1Pod[];\n extraColumns?: PodColumns[];\n children?: React.ReactNode;\n};\n\nconst READY: TableColumn<V1Pod>[] = [\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\nexport const PodsTable = ({ pods, extraColumns = [] }: PodsTablesProps) => {\n const podNamesWithMetrics = useContext(PodNamesWithMetricsContext);\n const cluster = useContext(ClusterContext);\n const defaultColumns: TableColumn<V1Pod>[] = [\n {\n title: 'name',\n highlight: true,\n render: (pod: V1Pod) => (\n <PodDrawer\n podAndErrors={{\n pod: pod as any,\n clusterName: cluster.name,\n errors: [],\n }}\n />\n ),\n },\n {\n title: 'phase',\n render: (pod: V1Pod) => pod.status?.phase ?? 'unknown',\n width: 'auto',\n },\n {\n title: 'status',\n render: containerStatuses,\n },\n ];\n const columns: TableColumn<V1Pod>[] = [...defaultColumns];\n\n if (extraColumns.includes(READY_COLUMNS)) {\n columns.push(...READY);\n }\n if (extraColumns.includes(RESOURCE_COLUMNS)) {\n const resourceColumns: TableColumn<V1Pod>[] = [\n {\n title: 'CPU usage %',\n render: (pod: V1Pod) => {\n const metrics = podNamesWithMetrics.get(pod.metadata?.name ?? '');\n\n if (!metrics) {\n return 'unknown';\n }\n\n return podStatusToCpuUtil(metrics);\n },\n width: 'auto',\n },\n {\n title: 'Memory usage %',\n render: (pod: V1Pod) => {\n const metrics = podNamesWithMetrics.get(pod.metadata?.name ?? '');\n\n if (!metrics) {\n return 'unknown';\n }\n\n return podStatusToMemoryUtil(metrics);\n },\n width: 'auto',\n },\n ];\n columns.push(...resourceColumns);\n }\n\n const tableStyle = {\n minWidth: '0',\n width: '100%',\n };\n\n const usePods = pods.map(p => ({ ...p, id: p.metadata?.uid }));\n\n return (\n <div style={tableStyle}>\n <Table\n options={{ paging: true, search: false, emptyRowsWhenPaging: false }}\n data={usePods}\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\ntype 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};\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\ntype 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\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\ntype 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\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\ntype 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\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 {customResource.hasOwnProperty('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\ninterface 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\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} from '@backstage/plugin-kubernetes-common';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { DeploymentsAccordions } from '../DeploymentsAccordions';\nimport { StatefulSetsAccordions } from '../StatefulSetsAccordions';\nimport { groupResponses } from '../../utils/response';\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 { PodNamesWithMetricsContext } from '../../hooks/PodNamesWithMetrics';\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\ntype ClusterProps = {\n clusterObjects: ClusterObjects;\n podsWithErrors: Set<string>;\n children?: React.ReactNode;\n};\n\nexport const Cluster = ({ clusterObjects, podsWithErrors }: ClusterProps) => {\n const groupedResponses = groupResponses(clusterObjects.resources);\n const podNameToMetrics = clusterObjects.podMetrics\n .flat()\n .reduce((accum, next) => {\n const name = next.pod.metadata?.name;\n if (name !== undefined) {\n accum.set(name, next);\n }\n return accum;\n }, new Map<string, ClientPodStatus>());\n return (\n <ClusterContext.Provider value={clusterObjects.cluster}>\n <GroupedResponsesContext.Provider value={groupedResponses}>\n <PodNamesWithMetricsContext.Provider value={podNameToMetrics}>\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 </PodNamesWithMetricsContext.Provider>\n </GroupedResponsesContext.Provider>\n </ClusterContext.Provider>\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 { Grid, Typography } from '@material-ui/core';\nimport { Entity } from '@backstage/catalog-model';\nimport { ErrorPanel } from './ErrorPanel';\nimport { ErrorReporting } from './ErrorReporting';\nimport { DetectedError, detectErrors } from '../error-detection';\nimport { Cluster } from './Cluster';\nimport EmptyStateImage from '../assets/emptystate.svg';\nimport { useKubernetesObjects } from '../hooks';\nimport { Content, Page, Progress } from '@backstage/core-components';\n\ntype KubernetesContentProps = {\n entity: Entity;\n refreshIntervalMs?: number;\n children?: React.ReactNode;\n};\n\nexport const KubernetesContent = ({\n entity,\n refreshIntervalMs,\n}: KubernetesContentProps) => {\n const { kubernetesObjects, error } = useKubernetesObjects(\n entity,\n refreshIntervalMs,\n );\n\n const clustersWithErrors =\n kubernetesObjects?.items.filter(r => r.errors.length > 0) ?? [];\n\n const detectedErrors =\n kubernetesObjects !== undefined\n ? detectErrors(kubernetesObjects)\n : new Map<string, DetectedError[]>();\n\n return (\n <Page themeId=\"tool\">\n <Content>\n {kubernetesObjects === undefined && error === undefined && <Progress />}\n\n {/* errors retrieved from the kubernetes clusters */}\n {clustersWithErrors.length > 0 && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ErrorPanel\n entityName={entity.metadata.name}\n clustersWithErrors={clustersWithErrors}\n />\n </Grid>\n </Grid>\n )}\n\n {/* other errors */}\n {error !== undefined && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ErrorPanel\n entityName={entity.metadata.name}\n errorMessage={error}\n />\n </Grid>\n </Grid>\n )}\n\n {kubernetesObjects && (\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ErrorReporting detectedErrors={detectedErrors} />\n </Grid>\n <Grid item>\n <Typography variant=\"h3\">Your Clusters</Typography>\n </Grid>\n <Grid item container>\n {kubernetesObjects?.items.length <= 0 && (\n <Grid\n container\n justifyContent=\"space-around\"\n direction=\"row\"\n alignItems=\"center\"\n spacing={2}\n >\n <Grid item xs={4}>\n <Typography variant=\"h5\">\n No resources on any known clusters for{' '}\n {entity.metadata.name}\n </Typography>\n </Grid>\n <Grid item xs={4}>\n <img\n src={EmptyStateImage}\n alt=\"EmptyState\"\n data-testid=\"emptyStateImg\"\n />\n </Grid>\n </Grid>\n )}\n {kubernetesObjects?.items.length > 0 &&\n kubernetesObjects?.items.map((item, i) => {\n const podsWithErrors = new Set<string>(\n detectedErrors\n .get(item.cluster.name)\n ?.filter(de => de.sourceRef.kind === 'Pod')\n .map(de => de.sourceRef.name),\n );\n\n return (\n <Grid item key={i} xs={12}>\n <Cluster\n clusterObjects={item}\n podsWithErrors={podsWithErrors}\n />\n </Grid>\n );\n })}\n </Grid>\n </Grid>\n )}\n </Content>\n </Page>\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 { Entity } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { Route, Routes } from 'react-router-dom';\nimport { KubernetesContent } from './components/KubernetesContent';\nimport { Button } from '@material-ui/core';\nimport { MissingAnnotationEmptyState } from '@backstage/core-components';\n\nconst KUBERNETES_ANNOTATION = 'backstage.io/kubernetes-id';\nconst KUBERNETES_LABEL_SELECTOR_QUERY_ANNOTATION =\n 'backstage.io/kubernetes-label-selector';\n\nexport const isKubernetesAvailable = (entity: Entity) =>\n Boolean(entity.metadata.annotations?.[KUBERNETES_ANNOTATION]) ||\n Boolean(\n entity.metadata.annotations?.[KUBERNETES_LABEL_SELECTOR_QUERY_ANNOTATION],\n );\n\nexport const Router = (props: { refreshIntervalMs?: number }) => {\n const { entity } = useEntity();\n\n const kubernetesAnnotationValue =\n entity.metadata.annotations?.[KUBERNETES_ANNOTATION];\n\n const kubernetesLabelSelectorQueryAnnotationValue =\n entity.metadata.annotations?.[KUBERNETES_LABEL_SELECTOR_QUERY_ANNOTATION];\n\n if (\n kubernetesAnnotationValue ||\n kubernetesLabelSelectorQueryAnnotationValue\n ) {\n return (\n <Routes>\n <Route\n path=\"/\"\n element={\n <KubernetesContent\n entity={entity}\n refreshIntervalMs={props.refreshIntervalMs}\n />\n }\n />\n </Routes>\n );\n }\n\n return (\n <>\n <MissingAnnotationEmptyState annotation={KUBERNETES_ANNOTATION} />\n <h1>\n Or use a label selector query, which takes precedence over the previous\n annotation.\n </h1>\n <Button\n variant=\"contained\"\n color=\"primary\"\n href=\"https://backstage.io/docs/features/kubernetes/configuration#surfacing-your-kubernetes-components-as-part-of-an-entity\"\n >\n Read Kubernetes Plugin Docs\n </Button>\n </>\n );\n};\n"],"names":["React","_a","_b","kindMappings","useDrawerStyles","useDrawerContentStyles","Close","BackstageButton","withStyles","_c","_d","_e","containerStatuses","Typography"],"mappings":"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"}