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
+ ,
],
},
];