From ca50d84d894247a0a1ff1d26819cfbf3cd19e769 Mon Sep 17 00:00:00 2001 From: SquirrelDevelopper Date: Mon, 10 Feb 2025 14:53:01 +0100 Subject: [PATCH] Add support for Remote System Information connection tests Introduced functionality to validate Remote System Information connection during device setup and diagnostics. Updated client, server, and shared-lib components to integrate this feature, including API endpoints, UI adjustments, and backend logic for connection testing. --- .../CheckDeviceConnection.tsx | 55 +++++- .../ExistingDeviceConnectionTest.tsx | 22 ++- .../NewDeviceModal/NewDeviceModal.tsx | 157 ++++++++++++------ client/src/services/rest/device.ts | 81 ++++++--- .../rest/devices/check-connection.ts | 52 ++++++ .../devices/check-connection.validator.ts | 10 ++ .../core/RemoteSSHExecutorComponent.ts | 28 ++++ server/src/routes/devices.ts | 15 ++ server/src/services/DeviceUseCases.ts | 68 ++++++++ shared-lib/src/types/api.ts | 5 + 10 files changed, 417 insertions(+), 76 deletions(-) diff --git a/client/src/components/DeviceConfiguration/CheckDeviceConnection.tsx b/client/src/components/DeviceConfiguration/CheckDeviceConnection.tsx index 48c6424e..b8a2c7d1 100644 --- a/client/src/components/DeviceConfiguration/CheckDeviceConnection.tsx +++ b/client/src/components/DeviceConfiguration/CheckDeviceConnection.tsx @@ -13,12 +13,15 @@ import { import { Alert, Popover, Steps, Typography } from 'antd'; import { motion } from 'framer-motion'; import React, { useEffect, useRef, useState } from 'react'; -import { API, SsmAnsible } from 'ssm-shared-lib'; +import { API, SsmAgent, SsmAnsible } from 'ssm-shared-lib'; export type CheckDeviceConnectionProps = { + installMethod: SsmAgent.InstallMethods; execId?: string; dockerConnRes?: string; dockerConnErrorMessage?: string; + rsiConnRes?: string; + rsiConnErrorMessage?: string; }; const taskInit: TaskStatusTimelineType = { @@ -34,11 +37,19 @@ const animationVariants = { }; const CheckDeviceConnection: React.FC = (props) => { - const { execId, dockerConnRes, dockerConnErrorMessage } = props; + const { + execId, + dockerConnRes, + dockerConnErrorMessage, + rsiConnErrorMessage, + rsiConnRes, + } = props; const timerIdRef = useRef(); const [isPollingEnabled, setIsPollingEnabled] = useState(false); const [playbookStatus, setPlaybookStatus] = useState('running...'); const [dockerStatus, setDockerStatus] = useState('running...'); + const [rsiStatus, setRsiStatus] = useState('running...'); + const [execRes, setExecRes] = useState(<>); const [smartFailure, setSmartFailure] = useState< API.SmartFailure | undefined @@ -108,6 +119,14 @@ const CheckDeviceConnection: React.FC = (props) => { } }, [dockerConnRes]); + useEffect(() => { + if (rsiConnRes) { + setRsiStatus(rsiConnRes); + } else { + setRsiStatus('running...'); + } + }, [rsiConnRes]); + useEffect(() => { const pollingCallback = () => { terminalHandler.pollingCallback(execId || ''); @@ -202,6 +221,38 @@ const CheckDeviceConnection: React.FC = (props) => { ), }, + ...(props.installMethod === SsmAgent.InstallMethods.LESS + ? [ + { + title: 'Remote System Information Connection test', + description: ( + <> + {rsiStatus}{' '} + {rsiStatus === 'failed' && ( + + {rsiConnErrorMessage} + + } + title={'Remote System Information Connection Logs'} + > + + + )} + + ), + icon: + rsiStatus === 'successful' ? ( + + ) : rsiStatus === 'failed' ? ( + + ) : ( + + ), + }, + ] + : []), ]} /> {smartFailure && ( diff --git a/client/src/components/DeviceConfiguration/diagnostic/ExistingDeviceConnectionTest.tsx b/client/src/components/DeviceConfiguration/diagnostic/ExistingDeviceConnectionTest.tsx index 71d77aa2..524d52e7 100644 --- a/client/src/components/DeviceConfiguration/diagnostic/ExistingDeviceConnectionTest.tsx +++ b/client/src/components/DeviceConfiguration/diagnostic/ExistingDeviceConnectionTest.tsx @@ -3,10 +3,11 @@ import { StreamlineComputerConnection } from '@/components/Icons/CustomIcons'; import { getCheckDeviceAnsibleConnection, getCheckDeviceDockerConnection, + getCheckDeviceRemoteSystemInformationConnection, } from '@/services/rest/device'; import { Avatar, Button, Card, Col, Row } from 'antd'; import React, { useState } from 'react'; -import { API } from 'ssm-shared-lib'; +import { API, SsmAgent } from 'ssm-shared-lib'; type ConnectionTestTabProps = { device: Partial; @@ -21,6 +22,12 @@ const ExistingDeviceConnectionTest: React.FC = ({ >(); const [dockerConnectionErrorMessage, setDockerConnectionErrorMessage] = useState(); + const [rsiConnectionStatus, setRsiConnectionStatus] = useState< + string | undefined + >(); + const [rsiConnectionErrorMessage, setRsiConnectionErrorMessage] = useState< + string | undefined + >(); const [testStarted, setTestStarted] = useState(false); const asyncFetch = async () => { if (!device.uuid) { @@ -29,6 +36,8 @@ const ExistingDeviceConnectionTest: React.FC = ({ setExecId(undefined); setDockerConnectionErrorMessage(undefined); setDockerConnectionStatus('running...'); + setRsiConnectionErrorMessage(undefined); + setRsiConnectionStatus('running...'); setTestStarted(true); await getCheckDeviceAnsibleConnection(device.uuid).then((e) => { setExecId(e.data.taskId); @@ -37,6 +46,14 @@ const ExistingDeviceConnectionTest: React.FC = ({ setDockerConnectionStatus(e.data.connectionStatus); setDockerConnectionErrorMessage(e.data.errorMessage); }); + if (device.agentType === SsmAgent.InstallMethods.LESS) { + await getCheckDeviceRemoteSystemInformationConnection(device.uuid).then( + (e) => { + setRsiConnectionStatus(e.data.connectionStatus); + setRsiConnectionErrorMessage(e.data.errorMessage); + }, + ); + } }; return ( = ({ > {testStarted && ( )}