/** * 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 { } interface Dependencies { subscribeStores: (stores: KubeObjectStore[], options: KubeWatchSubscribeStoreOptions) => Disposer; portForwardStore: PortForwardStore; } @observer class NonInjectedServiceDetails extends React.Component { 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 (
{service.getSelector().map(selector => )} {spec.type} {spec.sessionAffinity} {spec.clusterIP} {externalIps.length > 0 && ( {externalIps.map(ip =>
{ip}
)}
)}
{ service.getPorts().map((port) => ( )) }
{spec.type === "LoadBalancer" && spec.loadBalancerIP && ( {spec.loadBalancerIP} )}
); } } export const ServiceDetails = withInjectables( NonInjectedServiceDetails, { getProps: (di, props) => ({ subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores, portForwardStore: di.inject(portForwardStoreInjectable), ...props, }), }, );