diff --git a/src/app/SecurityPanel/ImportCertificate.tsx b/src/app/SecurityPanel/ImportCertificate.tsx index 6c35cd907..28e08b31d 100644 --- a/src/app/SecurityPanel/ImportCertificate.tsx +++ b/src/app/SecurityPanel/ImportCertificate.tsx @@ -60,6 +60,6 @@ const Component = () => { export const ImportCertificate: SecurityCard = { title: 'Import SSL Certificates', - description: 'Restart is needed to apply changes.', + description: 'The Cryostat server must be restarted in order to reload the certificate store.', content: Component, }; diff --git a/src/app/Topology/Shared/Entity/EntityDetails.tsx b/src/app/Topology/Shared/Entity/EntityDetails.tsx index e4153fc8e..380117d18 100644 --- a/src/app/Topology/Shared/Entity/EntityDetails.tsx +++ b/src/app/Topology/Shared/Entity/EntityDetails.tsx @@ -63,9 +63,10 @@ import { Tab, Tabs, TabTitleText, + Text, Tooltip, } from '@patternfly/react-core'; -import { WarningTriangleIcon } from '@patternfly/react-icons'; +import { ExclamationTriangleIcon, WarningTriangleIcon } from '@patternfly/react-icons'; import { css } from '@patternfly/react-styles'; import { ExpandableRowContent, TableComposable, Tbody, Td, Th, Thead, Tr } from '@patternfly/react-table'; import { GraphElement, NodeStatus } from '@patternfly/react-topology'; @@ -203,8 +204,26 @@ export const TargetDetails: React.FC<{ }, { key: 'JVM ID', - title: 'JVM ID', - helperTitle: 'JVM ID', + title: ( + <> + JVM ID + {!serviceRef.jvmId && ( + + + + )} + + ), + helperTitle: ( + <> + JVM ID + {!serviceRef.jvmId && ( + + + + )} + + ), helperDescription: constructHelperDescription('The ID of the current JVM.', 'Target', ['jvmId']), content: serviceRef.jvmId || , }, diff --git a/src/app/Topology/Shared/utils.tsx b/src/app/Topology/Shared/utils.tsx index d66975bc6..6fd5246c2 100644 --- a/src/app/Topology/Shared/utils.tsx +++ b/src/app/Topology/Shared/utils.tsx @@ -37,12 +37,12 @@ */ import { TopologyFilters } from '@app/Shared/Redux/Filters/TopologyFilterSlice'; import { evaluateTargetWithExpr } from '@app/utils/utils'; -import { Button } from '@patternfly/react-core'; +import { Button, Text, TextVariants } from '@patternfly/react-core'; import { ContextMenuSeparator, GraphElement, NodeStatus } from '@patternfly/react-topology'; import * as React from 'react'; import { BehaviorSubject, debounceTime, Observable, Subscription } from 'rxjs'; import { ContextMenuItem, MenuItemVariant, NodeAction, nodeActions } from '../Actions/NodeActions'; -import { WarningResolverAsCredModal } from '../Actions/WarningResolver'; +import { WarningResolverAsCredModal, WarningResolverAsLink } from '../Actions/WarningResolver'; import { EnvironmentNode, TargetNode, isTargetNode, NodeType, DEFAULT_EMPTY_UNIVERSE } from '../typings'; export const DiscoveryTreeContext = React.createContext(DEFAULT_EMPTY_UNIVERSE); @@ -95,7 +95,7 @@ export const getUniqueTargetId = (target: TargetNode) => { return `${target.id}`; }; -export type StatusExtra = { title?: string; description?: string; callForAction?: React.ReactNode[] }; +export type StatusExtra = { title?: string; description?: React.ReactNode; callForAction?: React.ReactNode[] }; export const getStatusTargetNode = (node: TargetNode | EnvironmentNode): [NodeStatus?, StatusExtra?] => { if (isTargetNode(node)) { @@ -105,13 +105,25 @@ export const getStatusTargetNode = (node: TargetNode | EnvironmentNode): [NodeSt NodeStatus.warning, { title: 'Failed to compute JVM ID', - description: `Target ${node.target.alias} might be missing credentials.`, + description: ( + <> + + If target has JMX Authentication enabled, add the credential to Cryostat keyring. + + + If the target has SSL enabled over JMX, add its certificate to Cryostat truststore. + + + ), callForAction: [ , + + Add certificates + , ], }, ];