1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00
lens/src/renderer/components/+network-services/service-details.tsx
2022-03-01 13:06:53 -05:00

151 lines
4.7 KiB
TypeScript

/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import "./service-details.scss";
import React from "react";
import { disposeOnUnmount, observer } from "mobx-react";
import { DrawerItem, DrawerTitle } from "../drawer";
import { Badge } from "../badge";
import type { KubeObjectDetailsProps } from "../kube-object-details";
import { Service } from "../../../common/k8s-api/endpoints";
import { KubeObjectMeta } from "../kube-object-meta";
import { ServicePortComponent } from "./service-port-component";
import { endpointStore } from "../+network-endpoints/endpoints.store";
import { ServiceDetailsEndpoint } from "./service-details-endpoint";
import type { PortForwardStore } from "../../port-forward";
import logger from "../../../common/logger";
import type { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import type { KubeObject } from "../../../common/k8s-api/kube-object";
import type { Disposer } from "../../../common/utils";
import { withInjectables } from "@ogre-tools/injectable-react";
import kubeWatchApiInjectable
from "../../kube-watch-api/kube-watch-api.injectable";
import portForwardStoreInjectable from "../../port-forward/port-forward-store/port-forward-store.injectable";
import type { KubeWatchSubscribeStoreOptions } from "../../kube-watch-api/kube-watch-api";
export interface ServiceDetailsProps extends KubeObjectDetailsProps<Service> {
}
interface Dependencies {
subscribeStores: (stores: KubeObjectStore<KubeObject>[], options: KubeWatchSubscribeStoreOptions) => Disposer;
portForwardStore: PortForwardStore;
}
@observer
class NonInjectedServiceDetails extends React.Component<ServiceDetailsProps & Dependencies> {
componentDidMount() {
const { object: service } = this.props;
disposeOnUnmount(this, [
this.props.subscribeStores([
endpointStore,
], {
namespaces: [service.getNs()],
}),
this.props.portForwardStore.watch(),
]);
}
render() {
const { object: service } = this.props;
if (!service) {
return null;
}
if (!(service instanceof Service)) {
logger.error("[ServiceDetails]: passed object that is not an instanceof Service", service);
return null;
}
const { spec } = service;
const endpoint = endpointStore.getByName(service.getName(), service.getNs());
const externalIps = service.getExternalIps();
if (externalIps.length === 0 && spec?.externalName) {
externalIps.push(spec.externalName);
}
return (
<div className="ServicesDetails">
<KubeObjectMeta object={service}/>
<DrawerItem name="Selector" labelsOnly>
{service.getSelector().map(selector => <Badge key={selector} label={selector}/>)}
</DrawerItem>
<DrawerItem name="Type">
{spec.type}
</DrawerItem>
<DrawerItem name="Session Affinity">
{spec.sessionAffinity}
</DrawerItem>
<DrawerTitle title="Connection"/>
<DrawerItem name="Cluster IP">
{spec.clusterIP}
</DrawerItem>
<DrawerItem name="Cluster IPs" hidden={!service.getClusterIps().length} labelsOnly>
{
service.getClusterIps().map(label => (
<Badge key={label} label={label}/>
))
}
</DrawerItem>
<DrawerItem name="IP families" hidden={!service.getIpFamilies().length}>
{service.getIpFamilies().join(", ")}
</DrawerItem>
<DrawerItem name="IP family policy" hidden={!service.getIpFamilyPolicy()}>
{service.getIpFamilyPolicy()}
</DrawerItem>
{externalIps.length > 0 && (
<DrawerItem name="External IPs">
{externalIps.map(ip => <div key={ip}>{ip}</div>)}
</DrawerItem>
)}
<DrawerItem name="Ports">
<div>
{
service.getPorts().map((port) => (
<ServicePortComponent service={service} port={port} key={port.toString()}/>
))
}
</div>
</DrawerItem>
{spec.type === "LoadBalancer" && spec.loadBalancerIP && (
<DrawerItem name="Load Balancer IP">
{spec.loadBalancerIP}
</DrawerItem>
)}
<DrawerTitle title="Endpoint"/>
<ServiceDetailsEndpoint endpoint={endpoint}/>
</div>
);
}
}
export const ServiceDetails = withInjectables<Dependencies, ServiceDetailsProps>(
NonInjectedServiceDetails,
{
getProps: (di, props) => ({
subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
portForwardStore: di.inject(portForwardStoreInjectable),
...props,
}),
},
);