/** * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ import "./crd-resource-details.scss"; import React from "react"; import jsonPath from "jsonpath"; import { observer } from "mobx-react"; import { cssNames } from "../../utils"; import { Badge } from "../badge"; import { DrawerItem } from "../drawer"; import type { KubeObjectDetailsProps } from "../kube-object-details"; import { KubeObjectMeta } from "../kube-object-meta"; import { Input } from "../input"; import { AdditionalPrinterColumnsV1, CustomResourceDefinition } from "../../../common/k8s-api/endpoints/crd.api"; import { parseJsonPath } from "../../utils/jsonPath"; import { KubeObject, KubeObjectMetadata, KubeObjectStatus } from "../../../common/k8s-api/kube-object"; import logger from "../../../common/logger"; interface Props extends KubeObjectDetailsProps { crd: CustomResourceDefinition; } function convertSpecValue(value: any): any { if (Array.isArray(value)) { return value.map(convertSpecValue); } if (typeof value === "object") { return ( ); } return value; } @observer export class CrdResourceDetails extends React.Component { renderAdditionalColumns(resource: KubeObject, columns: AdditionalPrinterColumnsV1[]) { return columns.map(({ name, jsonPath: jp }) => ( {convertSpecValue(jsonPath.value(resource, parseJsonPath(jp.slice(1))))} )); } renderStatus(customResource: KubeObject, columns: AdditionalPrinterColumnsV1[]) { const showStatus = !columns.find(column => column.name == "Status") && Array.isArray(customResource.status?.conditions); if (!showStatus) { return null; } const conditions = customResource.status.conditions .filter(({ type, reason }) => type || reason) .map(({ type, reason, message, status }) => ({ kind: type || reason, message, status })) .map(({ kind, message, status }, index) => ( )); return ( {conditions} ); } render() { const { props: { object, crd }} = this; if (!object || !crd) { return null; } if (!(object instanceof KubeObject)) { logger.error("[CrdResourceDetails]: passed object that is not an instanceof KubeObject", object); return null; } if (!(crd instanceof CustomResourceDefinition)) { logger.error("[CrdResourceDetails]: passed crd that is not an instanceof CustomResourceDefinition", crd); return null; } const extraColumns = crd.getPrinterColumns(); return (
{this.renderAdditionalColumns(object, extraColumns)} {this.renderStatus(object, extraColumns)}
); } }