import "./ingress-details.scss"; import React from "react"; import { disposeOnUnmount, observer } from "mobx-react"; import { reaction } from "mobx"; import { Trans } from "@lingui/macro"; import { DrawerItem, DrawerTitle } from "../drawer"; import { Ingress, ILoadBalancerIngress } from "../../api/endpoints"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { KubeEventDetails } from "../+events/kube-event-details"; import { ingressStore } from "./ingress.store"; import { ResourceMetrics } from "../resource-metrics"; import { KubeObjectDetailsProps } from "../kube-object"; import { IngressCharts } from "./ingress-charts"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { getBackendServiceNamePort } from "../../api/endpoints/ingress.api"; interface Props extends KubeObjectDetailsProps { } @observer export class IngressDetails extends React.Component { @disposeOnUnmount clean = reaction(() => this.props.object, () => { ingressStore.reset(); }); componentWillUnmount() { ingressStore.reset(); } renderPaths(ingress: Ingress) { const { spec: { rules } } = ingress; if (!rules || !rules.length) return null; return rules.map((rule, index) => { return (
{rule.host && (
Host: {rule.host}
)} {rule.http && ( Path Backends { rule.http.paths.map((path, index) => { const { serviceName, servicePort } = getBackendServiceNamePort(path.backend); const backend =`${serviceName}:${servicePort}`; return ( {path.path || ""}

{backend}

); }) }
)}
); }); } renderIngressPoints(ingressPoints: ILoadBalancerIngress[]) { if (!ingressPoints || ingressPoints.length === 0) return null; return (
Hostname IP {ingressPoints.map(({hostname, ip}, index) => { return ( {hostname ? hostname : "-"} {ip ? ip : "-"} );}) })
); } render() { const { object: ingress } = this.props; if (!ingress) { return null; } const { spec, status } = ingress; const ingressPoints = status?.loadBalancer?.ingress; const { metrics } = ingressStore; const metricTabs = [ Network, Duration, ]; const { serviceName, servicePort } = ingress.getServiceNamePort(); return (
ingressStore.loadMetrics(ingress)} tabs={metricTabs} object={ingress} params={{ metrics }} > Ports}> {ingress.getPorts()} {spec.tls && TLS}> {spec.tls.map((tls, index) =>

{tls.secretName}

)}
} {serviceName && servicePort && Service}> {serviceName}:{servicePort} } Rules}/> {this.renderPaths(ingress)} Load-Balancer Ingress Points}/> {this.renderIngressPoints(ingressPoints)}
); } } kubeObjectDetailRegistry.add({ kind: "Ingress", apiVersions: ["networking.k8s.io/v1", "extensions/v1beta1"], components: { Details: (props) => } }); kubeObjectDetailRegistry.add({ kind: "Ingress", apiVersions: ["networking.k8s.io/v1", "extensions/v1beta1"], priority: 5, components: { Details: (props) => } });