UNPKG

@kinvolk/headlamp-plugin

Version:

The needed infrastructure for building Headlamp plugins.

153 lines (152 loc) 5.82 kB
import { jsx as _jsx } from "react/jsx-runtime"; /* * Copyright 2025 The Kubernetes Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { useTranslation } from 'react-i18next'; import { useParams } from 'react-router-dom'; import GRPCRoute from '../../lib/k8s/grpcRoute'; import EmptyContent from '../common/EmptyContent'; import InnerTable from '../common/InnerTable'; import LabelListItem from '../common/LabelListItem'; import Link from '../common/Link'; import NameValueTable from '../common/NameValueTable'; import { DetailsGrid } from '../common/Resource'; import SectionBox from '../common/SectionBox'; import { GatewayParentRefSection } from './utils'; function GRPCRouteRuleTable(props) { const { rule, namespace } = props; const { t } = useTranslation(['glossary', 'translation']); const mainRows = [ { name: rule.name, withHighlightStyle: true, hide: rule.name === undefined, }, { name: t('translation|Matches'), value: _jsx(GRPCRuleMatches, { matches: rule?.matches || [] }), valueFullRow: true, hide: (rule.matches?.length || 0) === 0, }, { name: t('translation|BackendRefs'), value: _jsx(GRPCRuleBackendRefs, { backendRefs: rule?.backendRefs || [], namespace: namespace }), valueFullRow: true, hide: (rule.backendRefs?.length || 0) === 0, }, { name: t('translation|Filters'), value: _jsx(GRPCRuleFilters, { filters: rule?.filters || [] }), valueFullRow: true, hide: (rule.filters?.length || 0) === 0, }, ]; return _jsx(NameValueTable, { rows: mainRows }); } export function GRPCRuleMatches(props) { const { matches } = props; const { t } = useTranslation(); if (!matches) { return null; } return (_jsx(InnerTable, { columns: [ { label: t('translation|Match Type'), getter: (data) => data.method?.type, }, { label: t('translation|Service'), getter: (data) => data.method?.service, }, { label: t('translation|Method'), getter: (data) => data.method?.method, }, { label: t('translation|Headers'), getter: (data) => data.headers?.length, }, ], data: matches })); } export function GRPCRuleFilters(props) { const { filters } = props; const { t } = useTranslation(); if (!filters) { return null; } return (_jsx(InnerTable, { columns: [ { label: t('translation|Filter Type'), getter: (data) => data.type, }, ], data: filters })); } export function GRPCRuleBackendRefs(props) { const { backendRefs, namespace } = props; const { t } = useTranslation(); if (!backendRefs) { return null; } return (_jsx(InnerTable, { columns: [ { label: t('translation|Name'), getter: (data) => { const kind = data.kind ?? 'Service'; return (_jsx(Link, { routeName: kind.toLowerCase(), params: { namespace: data?.namespace ?? namespace, name: data.name }, children: data.name })); }, }, { label: t('translation|Namespace'), getter: (data) => data.namespace, }, { label: t('translation|Kind'), getter: (data) => data.kind ?? t('translation|Service'), }, { label: t('translation|Group'), getter: (data) => data.group, }, { label: t('translation|Port'), getter: (data) => data.port, }, { label: t('translation|Weight'), getter: (data) => data.weight, }, ], data: backendRefs })); } export default function GRPCRouteDetails(props) { const params = useParams(); const { name = params.name, namespace = params.namespace } = props; const { t } = useTranslation(['glossary', 'translation']); return (_jsx(DetailsGrid, { resourceType: GRPCRoute, name: name, namespace: namespace, extraInfo: grpcRoute => grpcRoute && [ { name: t('Hostnames'), value: _jsx(LabelListItem, { labels: grpcRoute.hostnames.map(hostname => `${hostname}`) }), hide: grpcRoute.hostnames.length === 0, }, ], withEvents: true, extraSections: (item) => item && [ { id: 'headlamp.grpcroute-rules', section: item && (_jsx(SectionBox, { title: t('Rules'), children: item.rules.length === 0 ? (_jsx(EmptyContent, { children: t('No data') })) : (item.rules.map((rule, index) => (_jsx(GRPCRouteRuleTable, { rule: rule, namespace: namespace }, index)))) })), }, { id: 'headlamp.grpcroute-parentrefs', section: _jsx(GatewayParentRefSection, { parentRefs: item?.parentRefs || [] }), }, ] })); }