diff --git a/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.test.ts b/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.test.ts index 3a98652c37..eb5606d5ca 100644 --- a/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.test.ts +++ b/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.test.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { createMockDirectory } from '@backstage/backend-test-utils'; import { ServiceAccountStrategy } from './ServiceAccountStrategy'; @@ -22,7 +23,7 @@ const mockDir = createMockDirectory({ }, }); -jest.mock('@kubernetes/client-node', () => ({ +const mockClient = { KubeConfig: class { #loaded = false; loadFromCluster() { @@ -43,12 +44,13 @@ jest.mock('@kubernetes/client-node', () => ({ }; } }, -})); +}; describe('ServiceAccountStrategy', () => { describe('#getCredential', () => { it('reads bearer token from config', async () => { const strategy = new ServiceAccountStrategy(); + (strategy as any).injectedKubernetesClient = mockClient; const credential = await strategy.getCredential({ name: '', @@ -65,6 +67,7 @@ describe('ServiceAccountStrategy', () => { describe('when serviceAccountToken is absent from config', () => { it('reads in-cluster token', async () => { const strategy = new ServiceAccountStrategy(); + (strategy as any).injectedKubernetesClient = mockClient; const credential = await strategy.getCredential({ name: '', diff --git a/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.ts b/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.ts index aff6e61a64..250a8d5250 100644 --- a/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.ts +++ b/plugins/kubernetes-backend/src/auth/ServiceAccountStrategy.ts @@ -20,7 +20,7 @@ import { ClusterDetails, KubernetesCredential, } from '@backstage/plugin-kubernetes-node'; -import { KubeConfig, User } from '@kubernetes/client-node'; +import type { User } from '@kubernetes/client-node'; import fs from 'fs-extra'; /** @@ -28,9 +28,16 @@ import fs from 'fs-extra'; * @public */ export class ServiceAccountStrategy implements AuthenticationStrategy { + // Only used in tests + private injectedKubernetesClient?: typeof import('@kubernetes/client-node'); + public async getCredential( clusterDetails: ClusterDetails, ): Promise { + const { KubeConfig } = + this.injectedKubernetesClient ?? + (await import('@kubernetes/client-node')); + const token = clusterDetails.authMetadata.serviceAccountToken; if (token) { return { type: 'bearer token', token }; diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 424212287f..a265a142bb 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -33,7 +33,7 @@ import { PodFetchResponse, PodStatusFetchResponse, } from '@backstage/plugin-kubernetes-common'; -import { +import type { ContainerStatus, CurrentResourceUsage, PodStatus, diff --git a/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts b/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts index abb98cfb81..d960f01645 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts @@ -14,14 +14,7 @@ * limitations under the License. */ -import { - bufferFromFileOrString, - Cluster, - CoreV1Api, - KubeConfig, - Metrics, - topPods, -} from '@kubernetes/client-node'; +import type { Cluster, CoreV1Api, Metrics } from '@kubernetes/client-node'; import lodash, { Dictionary } from 'lodash'; import { FetchResponseWrapper, @@ -126,12 +119,14 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { return Promise.all(fetchResults).then(fetchResultsToResponseWrapper); } - fetchPodMetricsByNamespaces( + async fetchPodMetricsByNamespaces( clusterDetails: ClusterDetails, credential: KubernetesCredential, namespaces: Set, labelSelector?: string, ): Promise { + const { topPods } = await import('@kubernetes/client-node'); + const fetchResults = Array.from(namespaces).map(async ns => { const [podMetrics, podList] = await Promise.all([ this.fetchResource( @@ -193,7 +188,7 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { }; } - private fetchResource( + private async fetchResource( clusterDetails: ClusterDetails, credential: KubernetesCredential, group: string, @@ -217,9 +212,9 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { clusterDetails.authMetadata[ANNOTATION_KUBERNETES_AUTH_PROVIDER]; if (this.isServiceAccountAuthentication(authProvider, clusterDetails)) { - [url, requestInit] = this.fetchArgsInCluster(credential); + [url, requestInit] = await this.fetchArgsInCluster(credential); } else if (!this.isCredentialMissing(authProvider, credential)) { - [url, requestInit] = this.fetchArgs(clusterDetails, credential); + [url, requestInit] = await this.fetchArgs(clusterDetails, credential); } else { return Promise.reject( new Error( @@ -261,10 +256,12 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { ); } - private fetchArgs( + private async fetchArgs( clusterDetails: ClusterDetails, credential: KubernetesCredential, - ): [URL, RequestInit] { + ): Promise<[URL, fetch.RequestInit]> { + const { bufferFromFileOrString } = await import('@kubernetes/client-node'); + const requestInit: RequestInit = { method: 'GET', headers: { @@ -293,9 +290,12 @@ export class KubernetesClientBasedFetcher implements KubernetesFetcher { } return [url, requestInit]; } - private fetchArgsInCluster( + + private async fetchArgsInCluster( credential: KubernetesCredential, - ): [URL, RequestInit] { + ): Promise<[URL, fetch.RequestInit]> { + const { KubeConfig } = await import('@kubernetes/client-node'); + const requestInit: RequestInit = { method: 'GET', headers: { diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index 51142a8d47..e176285a49 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -27,11 +27,7 @@ import { KubernetesRequestAuth, } from '@backstage/plugin-kubernetes-common'; import { AuthorizeResult } from '@backstage/plugin-permission-common'; -import { - bufferFromFileOrString, - Cluster, - KubeConfig, -} from '@kubernetes/client-node'; +import type { Cluster } from '@kubernetes/client-node'; import { createProxyMiddleware, RequestHandler } from 'http-proxy-middleware'; import fs from 'fs-extra'; @@ -176,6 +172,10 @@ export class KubernetesProxy { const cluster = await this.getClusterForRequest(req); const url = new URL(cluster.url); + const { bufferFromFileOrString } = await import( + '@kubernetes/client-node' + ); + const target: any = { protocol: url.protocol, host: url.hostname, @@ -234,6 +234,8 @@ export class KubernetesProxy { } private async getClusterForRequest(req: Request): Promise { + const { KubeConfig } = await import('@kubernetes/client-node'); + const clusterName = req.headers[HEADER_KUBERNETES_CLUSTER.toLowerCase()]; const clusters = await this.clusterSupplier.getClusters({ credentials: await this.httpAuth.credentials(req), diff --git a/plugins/kubernetes-cluster/src/components/ApiResources/ApiResources.tsx b/plugins/kubernetes-cluster/src/components/ApiResources/ApiResources.tsx index bc4cb7b795..f25cf0b950 100644 --- a/plugins/kubernetes-cluster/src/components/ApiResources/ApiResources.tsx +++ b/plugins/kubernetes-cluster/src/components/ApiResources/ApiResources.tsx @@ -17,7 +17,7 @@ import { useApiResources } from './useApiResources'; import { useCallback, useEffect } from 'react'; import { useEntity } from '@backstage/plugin-catalog-react'; import { Table, TableColumn } from '@backstage/core-components'; -import { IAPIGroup } from '@kubernetes-models/apimachinery/apis/meta/v1'; +import type { IAPIGroup } from '@kubernetes-models/apimachinery/apis/meta/v1'; import { useKubernetesClusterError } from '../KubernetesClusterErrorContext/KubernetesClusterErrorContext'; import { makeStyles } from '@material-ui/core/styles'; diff --git a/plugins/kubernetes-cluster/src/components/ApiResources/useApiResources.ts b/plugins/kubernetes-cluster/src/components/ApiResources/useApiResources.ts index 6724c5ac5d..ddf2e99f66 100644 --- a/plugins/kubernetes-cluster/src/components/ApiResources/useApiResources.ts +++ b/plugins/kubernetes-cluster/src/components/ApiResources/useApiResources.ts @@ -17,7 +17,7 @@ import useAsync from 'react-use/esm/useAsync'; import { useApi } from '@backstage/core-plugin-api'; import { kubernetesApiRef } from '@backstage/plugin-kubernetes-react'; -import { IAPIGroupList } from '@kubernetes-models/apimachinery/apis/meta/v1'; +import type { IAPIGroupList } from '@kubernetes-models/apimachinery/apis/meta/v1'; /** * Arguments for useApiResources diff --git a/plugins/kubernetes-common/report.api.md b/plugins/kubernetes-common/report.api.md index 80486259a2..2d94aaefff 100644 --- a/plugins/kubernetes-common/report.api.md +++ b/plugins/kubernetes-common/report.api.md @@ -9,21 +9,21 @@ import { FetchResponse as FetchResponse_2 } from '@backstage/plugin-kubernetes-c import type { JsonObject } from '@backstage/types'; import type { JsonValue } from '@backstage/types'; import { ObjectsByEntityResponse as ObjectsByEntityResponse_2 } from '@backstage/plugin-kubernetes-common'; -import { PodStatus } from '@kubernetes/client-node'; -import { V1ConfigMap } from '@kubernetes/client-node'; -import { V1CronJob } from '@kubernetes/client-node'; -import { V1DaemonSet } from '@kubernetes/client-node'; -import { V1Deployment } from '@kubernetes/client-node'; -import { V1Ingress } from '@kubernetes/client-node'; -import { V1Job } from '@kubernetes/client-node'; -import { V1LimitRange } from '@kubernetes/client-node'; -import { V1Pod } from '@kubernetes/client-node'; -import { V1ReplicaSet } from '@kubernetes/client-node'; -import { V1ResourceQuota } from '@kubernetes/client-node'; -import { V1Secret } from '@kubernetes/client-node'; -import { V1Service } from '@kubernetes/client-node'; -import { V1StatefulSet } from '@kubernetes/client-node'; -import { V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; +import type { PodStatus } from '@kubernetes/client-node'; +import type { V1ConfigMap } from '@kubernetes/client-node'; +import type { V1CronJob } from '@kubernetes/client-node'; +import type { V1DaemonSet } from '@kubernetes/client-node'; +import type { V1Deployment } from '@kubernetes/client-node'; +import type { V1Ingress } from '@kubernetes/client-node'; +import type { V1Job } from '@kubernetes/client-node'; +import type { V1LimitRange } from '@kubernetes/client-node'; +import type { V1Pod } from '@kubernetes/client-node'; +import type { V1ReplicaSet } from '@kubernetes/client-node'; +import type { V1ResourceQuota } from '@kubernetes/client-node'; +import type { V1Secret } from '@kubernetes/client-node'; +import type { V1Service } from '@kubernetes/client-node'; +import type { V1StatefulSet } from '@kubernetes/client-node'; +import type { V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; // @public export const ANNOTATION_KUBERNETES_API_SERVER = 'kubernetes.io/api-server'; diff --git a/plugins/kubernetes-common/src/error-detection/error-detection.test.ts b/plugins/kubernetes-common/src/error-detection/error-detection.test.ts index f57226a01c..fc10d74fef 100644 --- a/plugins/kubernetes-common/src/error-detection/error-detection.test.ts +++ b/plugins/kubernetes-common/src/error-detection/error-detection.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { +import type { V1Pod, V1Deployment, V2HorizontalPodAutoscaler, diff --git a/plugins/kubernetes-common/src/types.ts b/plugins/kubernetes-common/src/types.ts index 82b0caf3a9..5ef91a6d63 100644 --- a/plugins/kubernetes-common/src/types.ts +++ b/plugins/kubernetes-common/src/types.ts @@ -15,7 +15,7 @@ */ import type { JsonObject, JsonValue } from '@backstage/types'; -import { +import type { PodStatus, V1ConfigMap, V1CronJob, diff --git a/plugins/kubernetes-node/src/auth/PinnipedHelper.test.ts b/plugins/kubernetes-node/src/auth/PinnipedHelper.test.ts index 524e034117..1973ce0a7e 100644 --- a/plugins/kubernetes-node/src/auth/PinnipedHelper.test.ts +++ b/plugins/kubernetes-node/src/auth/PinnipedHelper.test.ts @@ -38,6 +38,8 @@ import { setupServer } from 'msw/node'; import { loggerToWinstonLogger } from '@backstage/backend-common'; import { ExtendedHttpServer } from '@backstage/backend-defaults/rootHttpRouter'; +jest.setTimeout(60_000); + describe('Pinniped - tokenCredentialRequest', () => { let app: ExtendedHttpServer; const logger = loggerToWinstonLogger(mockServices.logger.mock()); diff --git a/plugins/kubernetes-node/src/auth/PinnipedHelper.ts b/plugins/kubernetes-node/src/auth/PinnipedHelper.ts index 1f824bae33..f46999abdc 100644 --- a/plugins/kubernetes-node/src/auth/PinnipedHelper.ts +++ b/plugins/kubernetes-node/src/auth/PinnipedHelper.ts @@ -16,7 +16,6 @@ import { ClusterDetails } from '@backstage/plugin-kubernetes-node'; import * as https from 'https'; -import { bufferFromFileOrString } from '@kubernetes/client-node'; import fetch, { RequestInit } from 'node-fetch'; import { Logger } from 'winston'; @@ -75,7 +74,7 @@ export class PinnipedHelper { url.pathname = `/apis/${apiGroup}/tokencredentialrequests`; - const requestInit: RequestInit = this.buildRequestForPinniped( + const requestInit = await this.buildRequestForPinniped( url, clusterDetails, pinnipedParams, @@ -107,11 +106,13 @@ export class PinnipedHelper { return Promise.reject(data.status.message); } - private buildRequestForPinniped( + private async buildRequestForPinniped( url: URL, clusterDetails: ClusterDetails, pinnipedParams: PinnipedParameters, - ): RequestInit { + ): Promise { + const { bufferFromFileOrString } = await import('@kubernetes/client-node'); + const body = { apiVersion: pinnipedParams.tokenCredentialRequest?.apiGroup ?? diff --git a/plugins/kubernetes-react/report.api.md b/plugins/kubernetes-react/report.api.md index 3097d6ad22..cd71b70f70 100644 --- a/plugins/kubernetes-react/report.api.md +++ b/plugins/kubernetes-react/report.api.md @@ -22,8 +22,8 @@ import { FetchApi } from '@backstage/core-plugin-api'; import { GroupedResponses } from '@backstage/plugin-kubernetes-common'; import { IContainer } from 'kubernetes-models/v1'; import { IContainerStatus } from 'kubernetes-models/v1'; -import { IIoK8sApimachineryPkgApisMetaV1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; -import { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; +import type { IIoK8sApimachineryPkgApisMetaV1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; +import type { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; import { JsonObject } from '@backstage/types'; import { JSX as JSX_2 } from 'react/jsx-runtime'; import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; @@ -34,11 +34,11 @@ import { Pod } from 'kubernetes-models/v1'; import { Pod as Pod_2 } from 'kubernetes-models/v1/Pod'; import { ProfileInfoApi } from '@backstage/core-plugin-api'; import { ReactNode } from 'react'; -import { TypeMeta } from '@kubernetes-models/base'; -import { V1Job } from '@kubernetes/client-node'; -import { V1ObjectMeta } from '@kubernetes/client-node'; -import { V1Pod } from '@kubernetes/client-node'; -import { V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; +import type { TypeMeta } from '@kubernetes-models/base'; +import type { V1Job } from '@kubernetes/client-node'; +import type { V1ObjectMeta } from '@kubernetes/client-node'; +import type { V1Pod } from '@kubernetes/client-node'; +import type { V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; import { WorkloadsByEntityRequest } from '@backstage/plugin-kubernetes-common'; // @public (undocumented) diff --git a/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsAccordions.tsx b/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsAccordions.tsx index eba4b5ba5b..8eeed47eb6 100644 --- a/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsAccordions.tsx +++ b/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsAccordions.tsx @@ -20,7 +20,7 @@ import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { V1CronJob, V1Job } from '@kubernetes/client-node'; +import type { V1CronJob, V1Job } from '@kubernetes/client-node'; import { JobsAccordions } from '../JobsAccordions'; import { CronJobDrawer } from './CronJobsDrawer'; import { getOwnedResources } from '../../utils/owner'; diff --git a/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsDrawer.tsx b/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsDrawer.tsx index 110cfe4509..a7ffdca854 100644 --- a/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsDrawer.tsx +++ b/plugins/kubernetes-react/src/components/CronJobsAccordions/CronJobsDrawer.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { V1CronJob } from '@kubernetes/client-node'; +import type { V1CronJob } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import Typography from '@material-ui/core/Typography'; import Grid from '@material-ui/core/Grid'; diff --git a/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/Rollout.tsx b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/Rollout.tsx index e268f3a6e4..a299d412c9 100644 --- a/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/Rollout.tsx +++ b/plugins/kubernetes-react/src/components/CustomResources/ArgoRollouts/Rollout.tsx @@ -21,7 +21,7 @@ import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { V1Pod, V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; +import type { V1Pod, V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; import { PodsTable } from '../../Pods'; import { HorizontalPodAutoscalerDrawer } from '../../HorizontalPodAutoscalers'; import { RolloutDrawer } from './RolloutDrawer'; diff --git a/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsAccordions.tsx b/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsAccordions.tsx index ab2adca5da..a96034a012 100644 --- a/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsAccordions.tsx +++ b/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsAccordions.tsx @@ -20,7 +20,7 @@ import AccordionDetails from '@material-ui/core/AccordionDetails'; import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { V1Pod, V1DaemonSet } from '@kubernetes/client-node'; +import type { V1Pod, V1DaemonSet } from '@kubernetes/client-node'; import { PodsTable } from '../Pods'; import { DaemonSetDrawer } from './DaemonSetsDrawer'; import { getOwnedResources } from '../../utils/owner'; diff --git a/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsDrawer.tsx b/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsDrawer.tsx index 7e8f295408..400512f0d2 100644 --- a/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsDrawer.tsx +++ b/plugins/kubernetes-react/src/components/DaemonSetsAccordions/DaemonSetsDrawer.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { V1DaemonSet } from '@kubernetes/client-node'; +import type { V1DaemonSet } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import Typography from '@material-ui/core/Typography'; import Grid from '@material-ui/core/Grid'; diff --git a/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentDrawer.tsx b/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentDrawer.tsx index be9d5e4f1c..c94059ccc2 100644 --- a/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentDrawer.tsx +++ b/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentDrawer.tsx @@ -15,7 +15,7 @@ */ import { ReactNode } from 'react'; -import { V1Deployment } from '@kubernetes/client-node'; +import type { V1Deployment } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import { renderCondition } from '../../utils/pod'; import Typography from '@material-ui/core/Typography'; diff --git a/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx b/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx index 10d4be9352..75da5e7815 100644 --- a/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx +++ b/plugins/kubernetes-react/src/components/DeploymentsAccordions/DeploymentsAccordions.tsx @@ -21,7 +21,7 @@ import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { +import type { V1Deployment, V1Pod, V2HorizontalPodAutoscaler, diff --git a/plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx b/plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx index 8ccc3c3c79..22bc3cd6a6 100644 --- a/plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx +++ b/plugins/kubernetes-react/src/components/HorizontalPodAutoscalers/HorizontalPodAutoscalerDrawer.tsx @@ -15,7 +15,7 @@ */ import { ReactNode } from 'react'; -import { V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; +import type { V2HorizontalPodAutoscaler } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; /** @public */ diff --git a/plugins/kubernetes-react/src/components/IngressesAccordions/IngressDrawer.tsx b/plugins/kubernetes-react/src/components/IngressesAccordions/IngressDrawer.tsx index 737f1d1a5d..4adf9a438b 100644 --- a/plugins/kubernetes-react/src/components/IngressesAccordions/IngressDrawer.tsx +++ b/plugins/kubernetes-react/src/components/IngressesAccordions/IngressDrawer.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { V1Ingress } from '@kubernetes/client-node'; +import type { V1Ingress } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import Typography from '@material-ui/core/Typography'; import Grid from '@material-ui/core/Grid'; diff --git a/plugins/kubernetes-react/src/components/IngressesAccordions/IngressesAccordions.tsx b/plugins/kubernetes-react/src/components/IngressesAccordions/IngressesAccordions.tsx index c01f765f35..4e68985768 100644 --- a/plugins/kubernetes-react/src/components/IngressesAccordions/IngressesAccordions.tsx +++ b/plugins/kubernetes-react/src/components/IngressesAccordions/IngressesAccordions.tsx @@ -20,7 +20,7 @@ import AccordionDetails from '@material-ui/core/AccordionDetails'; import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { V1Ingress } from '@kubernetes/client-node'; +import type { V1Ingress } from '@kubernetes/client-node'; import { IngressDrawer } from './IngressDrawer'; import { GroupedResponsesContext } from '../../hooks'; import { StructuredMetadataTable } from '@backstage/core-components'; diff --git a/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.test.tsx b/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.test.tsx index 2399673820..584929cef1 100644 --- a/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.test.tsx +++ b/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.test.tsx @@ -19,11 +19,14 @@ import { JobsAccordions } from './JobsAccordions'; import * as oneCronJobsFixture from '../../__fixtures__/1-cronjobs.json'; import { renderInTestApp } from '@backstage/test-utils'; import { kubernetesProviders } from '../../hooks/test-utils'; -import { V1Job } from '@kubernetes/client-node'; -import { ObjectSerializer } from '@kubernetes/client-node/dist/gen/models/ObjectSerializer'; +import type { V1Job } from '@kubernetes/client-node'; describe('JobsAccordions', () => { it('should render 2 jobs', async () => { + const { ObjectSerializer } = await import( + '@kubernetes/client-node/dist/gen/models/ObjectSerializer' + ); + const wrapper = kubernetesProviders(oneCronJobsFixture, new Set()); const jobs: V1Job[] = oneCronJobsFixture.jobs.map( diff --git a/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.tsx b/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.tsx index 6398812d72..97d154c70a 100644 --- a/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.tsx +++ b/plugins/kubernetes-react/src/components/JobsAccordions/JobsAccordions.tsx @@ -19,7 +19,7 @@ import AccordionDetails from '@material-ui/core/AccordionDetails'; import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { V1Job, V1Pod } from '@kubernetes/client-node'; +import type { V1Job, V1Pod } from '@kubernetes/client-node'; import { PodsTable } from '../Pods'; import { JobDrawer } from './JobsDrawer'; import { getOwnedResources } from '../../utils/owner'; diff --git a/plugins/kubernetes-react/src/components/JobsAccordions/JobsDrawer.tsx b/plugins/kubernetes-react/src/components/JobsAccordions/JobsDrawer.tsx index 82078fd9dc..675fa9f427 100644 --- a/plugins/kubernetes-react/src/components/JobsAccordions/JobsDrawer.tsx +++ b/plugins/kubernetes-react/src/components/JobsAccordions/JobsDrawer.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { V1Job } from '@kubernetes/client-node'; +import type { V1Job } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import Typography from '@material-ui/core/Typography'; import Grid from '@material-ui/core/Grid'; diff --git a/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesDrawer.tsx b/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesDrawer.tsx index 0a30d449d0..323ce650d9 100644 --- a/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesDrawer.tsx +++ b/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesDrawer.tsx @@ -15,7 +15,7 @@ */ import { ReactNode, ChangeEvent, useState } from 'react'; -import { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; +import type { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; import Drawer from '@material-ui/core/Drawer'; import Grid from '@material-ui/core/Grid'; import IconButton from '@material-ui/core/IconButton'; diff --git a/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx b/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx index d393e4b073..fb52063177 100644 --- a/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx +++ b/plugins/kubernetes-react/src/components/KubernetesDrawer/KubernetesStructuredMetadataTableDrawer.tsx @@ -25,7 +25,7 @@ import Grid from '@material-ui/core/Grid'; import { makeStyles, createStyles, Theme } from '@material-ui/core/styles'; import Close from '@material-ui/icons/Close'; import OpenInNewIcon from '@material-ui/icons/OpenInNew'; -import { V1ObjectMeta } from '@kubernetes/client-node'; +import type { V1ObjectMeta } from '@kubernetes/client-node'; import { withStyles } from '@material-ui/core/styles'; import { LinkButton as BackstageButton, diff --git a/plugins/kubernetes-react/src/components/Pods/PodsTable.tsx b/plugins/kubernetes-react/src/components/Pods/PodsTable.tsx index b6cfd36d83..8d3c14d86a 100644 --- a/plugins/kubernetes-react/src/components/Pods/PodsTable.tsx +++ b/plugins/kubernetes-react/src/components/Pods/PodsTable.tsx @@ -27,7 +27,7 @@ import { Table, TableColumn } from '@backstage/core-components'; import { ClusterContext } from '../../hooks/Cluster'; import { useMatchingErrors } from '../../hooks/useMatchingErrors'; import { Pod } from 'kubernetes-models/v1/Pod'; -import { V1Pod } from '@kubernetes/client-node'; +import type { V1Pod } from '@kubernetes/client-node'; import { usePodMetrics } from '../../hooks/usePodMetrics'; import Typography from '@material-ui/core/Typography'; diff --git a/plugins/kubernetes-react/src/components/ServicesAccordions/ServiceDrawer.tsx b/plugins/kubernetes-react/src/components/ServicesAccordions/ServiceDrawer.tsx index accbeb565e..a9f7b7b5ad 100644 --- a/plugins/kubernetes-react/src/components/ServicesAccordions/ServiceDrawer.tsx +++ b/plugins/kubernetes-react/src/components/ServicesAccordions/ServiceDrawer.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { V1Service } from '@kubernetes/client-node'; +import type { V1Service } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import Typography from '@material-ui/core/Typography'; import Grid from '@material-ui/core/Grid'; diff --git a/plugins/kubernetes-react/src/components/ServicesAccordions/ServicesAccordions.tsx b/plugins/kubernetes-react/src/components/ServicesAccordions/ServicesAccordions.tsx index 9ad344ab08..34539ef2a9 100644 --- a/plugins/kubernetes-react/src/components/ServicesAccordions/ServicesAccordions.tsx +++ b/plugins/kubernetes-react/src/components/ServicesAccordions/ServicesAccordions.tsx @@ -21,7 +21,7 @@ import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { V1Service } from '@kubernetes/client-node'; +import type { V1Service } from '@kubernetes/client-node'; import { ServiceDrawer } from './ServiceDrawer'; import { GroupedResponsesContext } from '../../hooks'; import { StructuredMetadataTable } from '@backstage/core-components'; diff --git a/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx b/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx index 902d537c6c..7b7a2b7bb2 100644 --- a/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx +++ b/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetDrawer.tsx @@ -15,7 +15,7 @@ */ import { ReactNode } from 'react'; -import { V1StatefulSet } from '@kubernetes/client-node'; +import type { V1StatefulSet } from '@kubernetes/client-node'; import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; import { renderCondition } from '../../utils/pod'; import Typography from '@material-ui/core/Typography'; diff --git a/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx b/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx index 982f1c290b..e3ae9776bd 100644 --- a/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx +++ b/plugins/kubernetes-react/src/components/StatefulSetsAccordions/StatefulSetsAccordions.tsx @@ -21,7 +21,7 @@ import AccordionSummary from '@material-ui/core/AccordionSummary'; import Grid from '@material-ui/core/Grid'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { +import type { V1Pod, V2HorizontalPodAutoscaler, V1StatefulSet, diff --git a/plugins/kubernetes-react/src/hooks/useMatchingErrors.ts b/plugins/kubernetes-react/src/hooks/useMatchingErrors.ts index 78dd0e80e6..980a4dd336 100644 --- a/plugins/kubernetes-react/src/hooks/useMatchingErrors.ts +++ b/plugins/kubernetes-react/src/hooks/useMatchingErrors.ts @@ -18,8 +18,8 @@ import { DetectedError, ResourceRef, } from '@backstage/plugin-kubernetes-common'; -import { TypeMeta } from '@kubernetes-models/base'; -import { IIoK8sApimachineryPkgApisMetaV1ObjectMeta as V1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; +import type { TypeMeta } from '@kubernetes-models/base'; +import type { IIoK8sApimachineryPkgApisMetaV1ObjectMeta as V1ObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; /** * Context for detected errors diff --git a/plugins/kubernetes-react/src/hooks/usePodMetrics.ts b/plugins/kubernetes-react/src/hooks/usePodMetrics.ts index 863fc27c3a..b167ab590a 100644 --- a/plugins/kubernetes-react/src/hooks/usePodMetrics.ts +++ b/plugins/kubernetes-react/src/hooks/usePodMetrics.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { createContext, useContext } from 'react'; -import { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; +import type { IObjectMeta } from '@kubernetes-models/apimachinery/apis/meta/v1/ObjectMeta'; import { ClientPodStatus } from '@backstage/plugin-kubernetes-common'; /** diff --git a/plugins/kubernetes-react/src/utils/owner.ts b/plugins/kubernetes-react/src/utils/owner.ts index e7b7d25340..3e3aa11c95 100644 --- a/plugins/kubernetes-react/src/utils/owner.ts +++ b/plugins/kubernetes-react/src/utils/owner.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { +import type { V1ObjectMeta, V2HorizontalPodAutoscaler, V1Pod, diff --git a/plugins/kubernetes-react/src/utils/pod.tsx b/plugins/kubernetes-react/src/utils/pod.tsx index e0b1875b43..97b44d4d24 100644 --- a/plugins/kubernetes-react/src/utils/pod.tsx +++ b/plugins/kubernetes-react/src/utils/pod.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { +import type { V1Pod, V1PodCondition, V1DeploymentCondition,