Skip to content

Commit

Permalink
feat: add extra verification when deleting prod enclave. (#1404)
Browse files Browse the repository at this point in the history
Added extra verification where for production enclaves we will ask for enclave before user can delete it completely.
  • Loading branch information
Peeeekay committed Sep 28, 2023
1 parent c52cb97 commit 6e3ea07
Show file tree
Hide file tree
Showing 10 changed files with 26,678 additions and 27,043 deletions.
53,602 changes: 26,593 additions & 27,009 deletions engine/frontend/package-lock.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions engine/frontend/src/api/enclave.js
Expand Up @@ -13,6 +13,7 @@ export const getEnclavesFromKurtosis = async (token, apiHost) => {
status: enclave.apiContainerStatus,
host: enclave.apiContainerInfo.bridgeIpAddress,
port: enclave.apiContainerInfo.grpcPortInsideEnclave,
mode: enclave.mode,
}
});
}
Expand Down
102 changes: 76 additions & 26 deletions engine/frontend/src/component/Enclaves.js
Expand Up @@ -14,44 +14,93 @@ import {
Grid,
GridItem,
Text,
useDisclosure
} from '@chakra-ui/react'
useDisclosure,
FormControl,
FormHelperText,
Input
} from '@chakra-ui/react'

const DeleteAlertDialog = ({isOpen, cancelRef, onClose, enclaveName, setEnclaveName, handleDeleteClick}) => {
const DeleteAlertDialog = ({isOpen, cancelRef, onClose, enclaveToDelete, setEnclave, handleDeleteClick}) => {
const [deleting, setDeleting] = useState(false);

const [value, setValue] = useState("")
const [error, setError] = useState(false)

const enclaveName = enclaveToDelete.name;
const handleClose = (action) => {
const maybeDeleteRequest = async (action) => {

const clickCancel = () => {
setError(false)
setEnclave({})
onClose()
}

const clickDelete = async () => {
setDeleting(true)
await handleDeleteClick(enclaveName)
setDeleting(false)
setError(false)
clickCancel()
}

const maybeDeleteRequest = async () => {
if (action === "delete") {
setDeleting(true)
await handleDeleteClick(enclaveName)
setDeleting(false)
if (value === enclaveName) {
await clickDelete()
} else {
setError(true)
setValue("")
}
} else {
clickCancel()
}
setEnclaveName("")
onClose()
}
maybeDeleteRequest(action)

maybeDeleteRequest()
}

const handleInputChange = (val) => {
if (error) {
setError(false)
}
setValue(val)
}

return (
<AlertDialog
isOpen={isOpen}
leastDestructiveRef={cancelRef}
onClose={onClose}
onClose={ () => {
setError(false)
setValue("");
onClose();
}}
isCentered
>
<AlertDialogOverlay>
<AlertDialogContent>
<AlertDialogHeader fontSize='lg'>
<AlertDialogContent backgroundColor={"white"}>
<AlertDialogHeader fontSize='lg' color={"black"}>
Delete Enclave: <Text fontSize='lg' fontWeight='bold' as='i'> {enclaveName} </Text>
</AlertDialogHeader>

<AlertDialogBody>
Are you sure? You can't undo this action afterwards.
{
enclaveToDelete.mode ?
<FormControl>
<Input onChange={(e) => handleInputChange(e.target.value)} isInvalid={error} borderColor={"black"} color={"black"}/>
<FormHelperText color={error ? "red.600" : "black"} fontSize={"sm"}>
{error ?
"Please verify that the input matches the enclave name" :
"Enter the enclave name to delete the enclave"
}
</FormHelperText>
</FormControl> :
<Text> Are you sure? You can't undo this action afterwards. </Text>
}

</AlertDialogBody>

<AlertDialogFooter>
<Button ref={cancelRef} onClick={() => handleClose("cancel")}>
<Button ref={cancelRef} onClick={() => handleClose("cancel")} color={"black"}>
Cancel
</Button>
<Button bg="red.600" _hover={{ bg: "red.700"}} color="white" onClick={() => handleClose("delete")} ml={3} isLoading={deleting}>
Expand All @@ -64,7 +113,7 @@ const DeleteAlertDialog = ({isOpen, cancelRef, onClose, enclaveName, setEnclaveN
)
}

const Enclave = ({name, status, created, handleClick, handleDeleteClick, onOpen, setEnclaveName}) => {
const Enclave = ({name, status, handleClick, onOpen, mode, setEnclave}) => {
const backgroundColor = status === 1 ? "bg-[#24BA27]" : "bg-red-500"
return (
<Grid
Expand All @@ -76,7 +125,7 @@ const Enclave = ({name, status, created, handleClick, handleDeleteClick, onOpen,
<GridItem colSpan={4} align={"right"} style={{"zIndex":100}}>
<Button bg="red.600" _hover={{ bg: "red.700"}} color="white" mr="2" onClick={(e)=> {
e.stopPropagation()
setEnclaveName(name)
setEnclave({mode:mode, name:name})
onOpen()
}}> Delete </Button>
</GridItem>
Expand All @@ -91,7 +140,7 @@ const Enclave = ({name, status, created, handleClick, handleDeleteClick, onOpen,
)
}

const EnclaveMainComponent = ({onOpen, enclaves, handleClick, handleDeleteClick, setEnclaveName}) => (
const EnclaveMainComponent = ({onOpen, enclaves, handleClick, handleDeleteClick, setEnclave}) => (
<div className='grid grid-cols-2 gap-4 flex-1'>
{
enclaves.map(enclave => {
Expand All @@ -104,15 +153,16 @@ const EnclaveMainComponent = ({onOpen, enclaves, handleClick, handleDeleteClick,
created={enclave.created}
handleClick={handleClick}
handleDeleteClick={handleDeleteClick}
setEnclaveName={setEnclaveName}
setEnclave={setEnclave}
mode={enclave.mode ? enclave.mode : false}
/>
)
})
}
</div>
)

const EnclaveComponent = ({onOpen, enclaves, handleClick, handleCreateEnvClick, handleDeleteClick, setEnclaveName}) => {
const EnclaveComponent = ({onOpen, enclaves, handleClick, handleCreateEnvClick, handleDeleteClick, setEnclave}) => {
return (
<div className="flex-1 bg-[#171923] overflow-auto">
{
Expand All @@ -132,7 +182,7 @@ const EnclaveComponent = ({onOpen, enclaves, handleClick, handleCreateEnvClick,
</div>
</div>
:
<EnclaveMainComponent setEnclaveName={setEnclaveName} onOpen={onOpen} enclaves={enclaves} handleClick={handleClick} handleDeleteClick={handleDeleteClick}/>
<EnclaveMainComponent setEnclave={setEnclave} onOpen={onOpen} enclaves={enclaves} handleClick={handleClick} handleDeleteClick={handleDeleteClick}/>
}
</div>
)
Expand All @@ -141,7 +191,7 @@ const EnclaveComponent = ({onOpen, enclaves, handleClick, handleCreateEnvClick,
const Enclaves = ({enclaves, isLoading, handleDeleteClick}) => {
const navigate = useNavigate()
const cancelRef = useRef()
const [enclaveName, setEnclaveName] = useState("")
const [enclaveToDelete, setEnclave] = useState({})
const { isOpen, onOpen, onClose } = useDisclosure()

const handleCreateEnvClick = () => {
Expand All @@ -155,15 +205,15 @@ const Enclaves = ({enclaves, isLoading, handleDeleteClick}) => {
return (
<div className="flex h-full flex-grow">
{
(isLoading) ? <LoadingOverlay/> : <EnclaveComponent setEnclaveName={setEnclaveName} onOpen={onOpen} enclaves={enclaves} handleClick={handleClick} handleCreateEnvClick={handleCreateEnvClick} handleDeleteClick={handleDeleteClick}/>
(isLoading) ? <LoadingOverlay/> : <EnclaveComponent setEnclave={setEnclave} onOpen={onOpen} enclaves={enclaves} handleClick={handleClick} handleCreateEnvClick={handleCreateEnvClick} handleDeleteClick={handleDeleteClick}/>
}
<DeleteAlertDialog
isOpen={isOpen}
onOpen={onOpen}
onClose={onClose}
cancelRef={cancelRef}
enclaveName={enclaveName}
setEnclaveName={setEnclaveName}
enclaveToDelete={enclaveToDelete}
setEnclave={setEnclave}
handleDeleteClick={handleDeleteClick}
/>
</div>
Expand Down
6 changes: 3 additions & 3 deletions engine/server/webapp/asset-manifest.json
@@ -1,13 +1,13 @@
{
"files": {
"main.css": "./static/css/main.d26dfda9.css",
"main.js": "./static/js/main.efccb412.js",
"main.js": "./static/js/main.5a8291dc.js",
"index.html": "./index.html",
"main.d26dfda9.css.map": "./static/css/main.d26dfda9.css.map",
"main.efccb412.js.map": "./static/js/main.efccb412.js.map"
"main.5a8291dc.js.map": "./static/js/main.5a8291dc.js.map"
},
"entrypoints": [
"static/css/main.d26dfda9.css",
"static/js/main.efccb412.js"
"static/js/main.5a8291dc.js"
]
}
2 changes: 1 addition & 1 deletion engine/server/webapp/index.html
@@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><title>Kurtosis Enclave Manager</title><script defer="defer" src="./static/js/main.efccb412.js"></script><link href="./static/css/main.d26dfda9.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><title>Kurtosis Enclave Manager</title><script defer="defer" src="./static/js/main.5a8291dc.js"></script><link href="./static/css/main.d26dfda9.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
3 changes: 3 additions & 0 deletions engine/server/webapp/static/js/main.5a8291dc.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions engine/server/webapp/static/js/main.5a8291dc.js.map

Large diffs are not rendered by default.

3 changes: 0 additions & 3 deletions engine/server/webapp/static/js/main.efccb412.js

This file was deleted.

1 change: 0 additions & 1 deletion engine/server/webapp/static/js/main.efccb412.js.map

This file was deleted.

0 comments on commit 6e3ea07

Please sign in to comment.