parent
43cc7b8852
commit
8fa54b7290
1 changed files with 219 additions and 0 deletions
@ -0,0 +1,219 @@ |
|||||||
|
import { |
||||||
|
Box as MUIBox, |
||||||
|
FormControl, |
||||||
|
FormControlLabel, |
||||||
|
FormGroup, |
||||||
|
FormLabel as MUIFormLabel, |
||||||
|
Grid, |
||||||
|
Radio as MUIRadio, |
||||||
|
radioClasses as muiRadioClasses, |
||||||
|
RadioGroup, |
||||||
|
styled, |
||||||
|
SxProps, |
||||||
|
Theme, |
||||||
|
} from '@mui/material'; |
||||||
|
import Head from 'next/head'; |
||||||
|
import { FC, useMemo, useRef, useState } from 'react'; |
||||||
|
|
||||||
|
import { GREY } from '../../lib/consts/DEFAULT_THEME'; |
||||||
|
|
||||||
|
import FlexBox from '../../components/FlexBox'; |
||||||
|
import Header from '../../components/Header'; |
||||||
|
import { Panel, PanelHeader } from '../../components/Panels'; |
||||||
|
import { BodyText, HeaderText } from '../../components/Text'; |
||||||
|
import OutlinedInputWithLabel from '../../components/OutlinedInputWithLabel'; |
||||||
|
import ContainedButton from '../../components/ContainedButton'; |
||||||
|
import InputWithRef, { |
||||||
|
InputForwardedRefContent, |
||||||
|
} from '../../components/InputWithRef'; |
||||||
|
import Spinner from '../../components/Spinner'; |
||||||
|
import INPUT_TYPES from '../../lib/consts/INPUT_TYPES'; |
||||||
|
import mainAxiosInstance from '../../lib/singletons/mainAxiosInstance'; |
||||||
|
|
||||||
|
const INPUT_PARENT_SX: SxProps<Theme> = { |
||||||
|
'& > *': { flexBasis: { xs: '50%' } }, |
||||||
|
}; |
||||||
|
|
||||||
|
const Radio = styled(MUIRadio)({ |
||||||
|
[`&.${muiRadioClasses.root}`]: { |
||||||
|
color: GREY, |
||||||
|
}, |
||||||
|
}); |
||||||
|
|
||||||
|
const PrepareHost: FC = () => { |
||||||
|
const inputEnterpriseKeyRef = useRef<InputForwardedRefContent<'string'>>({}); |
||||||
|
const inputHostIPAddressRef = useRef<InputForwardedRefContent<'string'>>({}); |
||||||
|
const inputHostNameRef = useRef<InputForwardedRefContent<'string'>>({}); |
||||||
|
const inputHostPasswordRef = useRef<InputForwardedRefContent<'string'>>({}); |
||||||
|
const inputRedhatPassword = useRef<InputForwardedRefContent<'string'>>({}); |
||||||
|
const inputRedhatUser = useRef<InputForwardedRefContent<'string'>>({}); |
||||||
|
|
||||||
|
const [isShowAccessSection, setIsShowAccessSection] = |
||||||
|
useState<boolean>(false); |
||||||
|
const [isShowOptionalSection, setIsShowOptionalSection] = |
||||||
|
useState<boolean>(false); |
||||||
|
const [isShowRedhatSection, setIsShowRedhatSection] = |
||||||
|
useState<boolean>(false); |
||||||
|
const [isTestAccessInProgress, setIsTestAccessInProgress] = |
||||||
|
useState<boolean>(false); |
||||||
|
|
||||||
|
const testAccessElement = useMemo( |
||||||
|
() => |
||||||
|
isShowOptionalSection ? ( |
||||||
|
<></> |
||||||
|
) : ( |
||||||
|
<FlexBox row sx={{ justifyContent: 'flex-end' }}> |
||||||
|
<ContainedButton |
||||||
|
onClick={() => { |
||||||
|
setIsTestAccessInProgress(true); |
||||||
|
|
||||||
|
mainAxiosInstance |
||||||
|
.put< |
||||||
|
{ status: number }, |
||||||
|
{ |
||||||
|
hostName: string; |
||||||
|
hostOS: string; |
||||||
|
hostUUID: string; |
||||||
|
isConnected: boolean; |
||||||
|
isInetConnected: boolean; |
||||||
|
isOSRegistered: boolean; |
||||||
|
}, |
||||||
|
{ ipAddress?: string; password?: string } |
||||||
|
>('/command/inquire', { |
||||||
|
ipAddress: inputHostIPAddressRef.current.getValue?.call(null), |
||||||
|
password: inputHostPasswordRef.current.getValue?.call(null), |
||||||
|
}) |
||||||
|
.then( |
||||||
|
({ hostName, hostOS, isInetConnected, isOSRegistered }) => { |
||||||
|
inputHostNameRef.current.setValue?.call(null, hostName); |
||||||
|
|
||||||
|
if ( |
||||||
|
isInetConnected && |
||||||
|
/rhel/i.test(hostOS) && |
||||||
|
!isOSRegistered |
||||||
|
) { |
||||||
|
setIsShowRedhatSection(true); |
||||||
|
} |
||||||
|
|
||||||
|
setIsShowOptionalSection(true); |
||||||
|
}, |
||||||
|
) |
||||||
|
.catch((error) => { |
||||||
|
const { request, response, message, config } = error; |
||||||
|
}) |
||||||
|
.finally(() => { |
||||||
|
setIsTestAccessInProgress(false); |
||||||
|
}); |
||||||
|
}} |
||||||
|
> |
||||||
|
Test access |
||||||
|
</ContainedButton> |
||||||
|
</FlexBox> |
||||||
|
), |
||||||
|
[isShowOptionalSection], |
||||||
|
); |
||||||
|
|
||||||
|
return ( |
||||||
|
<> |
||||||
|
<Head> |
||||||
|
<title>Prepare Host</title> |
||||||
|
</Head> |
||||||
|
<Header /> |
||||||
|
<Grid container columns={{ xs: 1, sm: 6, md: 4 }}> |
||||||
|
<Grid item sm={1} xs={0} /> |
||||||
|
<Grid item md={2} sm={4} xs={1}> |
||||||
|
<Panel> |
||||||
|
<PanelHeader> |
||||||
|
<HeaderText>Prepare a host to include in Anvil!</HeaderText> |
||||||
|
</PanelHeader> |
||||||
|
<FlexBox> |
||||||
|
{/* Build radio group with label */} |
||||||
|
<FormControl> |
||||||
|
<MUIFormLabel> |
||||||
|
<BodyText>Host type</BodyText> |
||||||
|
</MUIFormLabel> |
||||||
|
<RadioGroup |
||||||
|
onChange={() => { |
||||||
|
setIsShowAccessSection(true); |
||||||
|
}} |
||||||
|
row |
||||||
|
> |
||||||
|
<FormControlLabel |
||||||
|
control={<Radio />} |
||||||
|
value="node" |
||||||
|
label={<BodyText>Node</BodyText>} |
||||||
|
/> |
||||||
|
<FormControlLabel |
||||||
|
control={<Radio />} |
||||||
|
value="drhost" |
||||||
|
label={<BodyText>Disaster Recovery (DR) host</BodyText>} |
||||||
|
/> |
||||||
|
</RadioGroup> |
||||||
|
</FormControl> |
||||||
|
{isShowAccessSection && ( |
||||||
|
<FlexBox> |
||||||
|
<FlexBox sm="row" spacing="1em" sx={INPUT_PARENT_SX}> |
||||||
|
<InputWithRef |
||||||
|
input={<OutlinedInputWithLabel label="Host IP address" />} |
||||||
|
ref={inputHostIPAddressRef} |
||||||
|
/> |
||||||
|
<InputWithRef |
||||||
|
input={ |
||||||
|
<OutlinedInputWithLabel |
||||||
|
inputProps={{ type: INPUT_TYPES.password }} |
||||||
|
label="Host root password" |
||||||
|
/> |
||||||
|
} |
||||||
|
ref={inputHostPasswordRef} |
||||||
|
/> |
||||||
|
</FlexBox> |
||||||
|
{isTestAccessInProgress ? <Spinner /> : testAccessElement} |
||||||
|
</FlexBox> |
||||||
|
)} |
||||||
|
{isShowOptionalSection && ( |
||||||
|
<FlexBox> |
||||||
|
<FlexBox sm="row" sx={INPUT_PARENT_SX}> |
||||||
|
<InputWithRef |
||||||
|
input={<OutlinedInputWithLabel label="Host name" />} |
||||||
|
ref={inputHostNameRef} |
||||||
|
/> |
||||||
|
<InputWithRef |
||||||
|
input={ |
||||||
|
<OutlinedInputWithLabel label="Alteeve enterprise key" /> |
||||||
|
} |
||||||
|
ref={inputEnterpriseKeyRef} |
||||||
|
/> |
||||||
|
</FlexBox> |
||||||
|
{isShowRedhatSection && ( |
||||||
|
<FlexBox sm="row" sx={INPUT_PARENT_SX}> |
||||||
|
<InputWithRef |
||||||
|
input={ |
||||||
|
<OutlinedInputWithLabel label="RedHat username" /> |
||||||
|
} |
||||||
|
ref={inputRedhatUser} |
||||||
|
/> |
||||||
|
<InputWithRef |
||||||
|
input={ |
||||||
|
<OutlinedInputWithLabel |
||||||
|
inputProps={{ type: INPUT_TYPES.password }} |
||||||
|
label="RedHat password" |
||||||
|
/> |
||||||
|
} |
||||||
|
ref={inputRedhatPassword} |
||||||
|
/> |
||||||
|
</FlexBox> |
||||||
|
)} |
||||||
|
<FlexBox row sx={{ justifyContent: 'flex-end' }}> |
||||||
|
<ContainedButton>Prepare host</ContainedButton> |
||||||
|
</FlexBox> |
||||||
|
</FlexBox> |
||||||
|
)} |
||||||
|
</FlexBox> |
||||||
|
</Panel> |
||||||
|
</Grid> |
||||||
|
</Grid> |
||||||
|
</> |
||||||
|
); |
||||||
|
}; |
||||||
|
|
||||||
|
export default PrepareHost; |
Loading…
Reference in new issue