in frontend/src/old-pages/Clusters/Actions.tsx [36:266]
export default function Actions() {
const clusterName = useState(['app', 'clusters', 'selected'])
const clusterPath = ['clusters', 'index', clusterName]
const cluster = useState(clusterPath)
const defaultRegion = useState(['aws', 'region'])
const region = useState(['app', 'selectedRegion']) || defaultRegion
const headNode = useState([...clusterPath, 'headNode'])
let navigate = useNavigate()
const {t} = useTranslation()
const apiVersion = useState(['app', 'version', 'full'])
const clusterVersion = useState([...clusterPath, 'version'])
const fleetStatus = useState([...clusterPath, 'computeFleetStatus'])
const clusterStatus = useState([...clusterPath, 'clusterStatus'])
const dcvEnabled = useState([
...clusterPath,
'config',
'HeadNode',
'Dcv',
'Enabled',
])
function isSsmPolicy(p: any) {
return p.hasOwnProperty('Policy') && p.Policy === ssmPolicy(region)
}
const iamPolicies = useState([
...clusterPath,
'config',
'HeadNode',
'Iam',
'AdditionalIamPolicies',
])
const ssmEnabled = iamPolicies && findFirst(iamPolicies, isSsmPolicy)
const isHeadNode =
headNode && headNode.publicIpAddress && headNode.publicIpAddress !== ''
const isEditDisabled =
clusterStatus === ClusterStatus.CreateInProgress ||
clusterStatus === ClusterStatus.DeleteInProgress ||
clusterStatus === ClusterStatus.UpdateInProgress ||
clusterStatus === ClusterStatus.CreateFailed ||
clusterVersion !== apiVersion
const isStartFleetDisabled = fleetStatus !== 'STOPPED'
const isStopFleetDisabled = fleetStatus !== 'RUNNING'
const isDeleteDisabled =
!clusterName || clusterStatus === ClusterStatus.DeleteInProgress
const isSsmDisabled =
clusterStatus === ClusterStatus.DeleteInProgress || !ssmEnabled
const isDcvDisabled =
!isHeadNode ||
clusterStatus === ClusterStatus.DeleteInProgress ||
!dcvEnabled
const startFleet = React.useCallback(() => {
UpdateComputeFleet(clusterName, 'START_REQUESTED')
}, [clusterName])
const editConfiguration = React.useCallback(() => {
setState(['app', 'wizard', 'clusterName'], clusterName)
setState(['app', 'wizard', 'page'], 'cluster')
setState(['app', 'wizard', 'editing'], true)
navigate('/configure')
loadTemplateFromCluster(clusterName)
}, [clusterName, navigate])
const deleteCluster = React.useCallback(() => {
console.log(`Deleting: ${clusterName}`)
DeleteCluster(clusterName, (_resp: any) => {
navigate('/clusters')
})
hideDialog('deleteCluster')
}, [clusterName, navigate])
const shellCluster = React.useCallback(
(instanceId: any) => {
window.open(
`${consoleDomain(
region,
)}/systems-manager/session-manager/${instanceId}?region=${region}`,
)
},
[region],
)
const ssmFilesystem = React.useCallback(
(instanceId: any) => {
let user = clusterDefaultUser(cluster)
const path = encodeURIComponent(`/home/${user}/`)
window.open(
`${consoleDomain(
region,
)}/systems-manager/managed-instances/${instanceId}/file-system?region=${region}&osplatform=Linux#%7B%22path%22%3A%22${path}%22%7D`,
)
},
[cluster, region],
)
const dcvConnect = React.useCallback(
(instance: any) => {
let callback = (dcvInfo: any) => {
window.open(
`https://${instance.publicIpAddress}:${dcvInfo.port}?authToken=${dcvInfo.session_token}#${dcvInfo.session_id}`,
)
}
let user = clusterDefaultUser(cluster)
GetDcvSession(instance.instanceId, user, callback)
},
[cluster],
)
const openFileSystem = React.useCallback(() => {
ssmFilesystem(headNode.instanceId)
}, [headNode?.instanceId, ssmFilesystem])
const onShellClick = React.useCallback(() => {
shellCluster(headNode.instanceId)
}, [headNode?.instanceId, shellCluster])
const onDcvClick = React.useCallback(() => {
dcvConnect(headNode)
}, [dcvConnect, headNode])
const onItemClick: CancelableEventHandler<ButtonDropdownProps.ItemClickDetails> =
React.useCallback(
item => {
switch (item.detail.id) {
case 'filesystem':
openFileSystem()
break
case 'edit':
editConfiguration()
break
case 'logs':
navigate(`/clusters/${clusterName}/logs`)
break
case 'delete':
showDialog('deleteCluster')
break
}
},
[openFileSystem, editConfiguration, navigate, clusterName],
)
const clusterActionsGroupButtonItems: ButtonDropdownProps.ItemOrGroup[] =
React.useMemo(() => {
return [
{
id: 'logs',
text: t('cluster.list.actions.logs'),
},
{
id: 'filesystem',
text: t('cluster.list.actions.filesystem'),
disabled: isSsmDisabled,
external: true,
href: '#',
},
{
id: 'edit',
text: t('cluster.list.actions.edit'),
disabled: isEditDisabled,
},
{
id: 'delete',
text: t('cluster.list.actions.delete'),
disabled: isDeleteDisabled,
},
]
}, [t, isSsmDisabled, isEditDisabled, isDeleteDisabled])
const isActionsDisabled = isSsmDisabled && isEditDisabled && isDeleteDisabled
return (
<>
<DeleteDialog
id="deleteCluster"
header={t('cluster.list.dialogs.delete.title')}
deleteCallback={deleteCluster}
>
{t('cluster.list.dialogs.delete.body', {clusterName: clusterName})}
</DeleteDialog>
<StopDialog clusterName={clusterName} />
<SpaceBetween direction="horizontal" size="xs">
<Button
disabled={isSsmDisabled}
onClick={onShellClick}
iconName="external"
>
{t('cluster.list.actions.shell')}
</Button>
<Button
disabled={isDcvDisabled}
onClick={onDcvClick}
iconName="external"
>
{t('cluster.list.actions.dcv')}
</Button>
{isStartFleetDisabled ? (
<Button
variant="normal"
onClick={stopComputeFleet}
disabled={isStopFleetDisabled}
>
{t('cluster.list.actions.stop')}
</Button>
) : (
<Button
variant="normal"
onClick={startFleet}
disabled={isStartFleetDisabled}
>
{t('cluster.list.actions.start')}
</Button>
)}
<ButtonDropdown
onItemClick={onItemClick}
items={clusterActionsGroupButtonItems}
disabled={isActionsDisabled}
>
{t('cluster.list.actionsLabel')}
</ButtonDropdown>
<CreateButtonDropdown openWizard={wizardShow} />
</SpaceBetween>
</>
)
}