Skip to content

Commit 6e3ea07

Browse files
authored
feat: add extra verification when deleting prod enclave. (#1404)
Added extra verification where for production enclaves we will ask for enclave before user can delete it completely.
1 parent c52cb97 commit 6e3ea07

File tree

10 files changed

+26678
-27043
lines changed

10 files changed

+26678
-27043
lines changed

engine/frontend/package-lock.json

Lines changed: 26593 additions & 27009 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

engine/frontend/src/api/enclave.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export const getEnclavesFromKurtosis = async (token, apiHost) => {
1313
status: enclave.apiContainerStatus,
1414
host: enclave.apiContainerInfo.bridgeIpAddress,
1515
port: enclave.apiContainerInfo.grpcPortInsideEnclave,
16+
mode: enclave.mode,
1617
}
1718
});
1819
}

engine/frontend/src/component/Enclaves.js

Lines changed: 76 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,44 +14,93 @@ import {
1414
Grid,
1515
GridItem,
1616
Text,
17-
useDisclosure
18-
} from '@chakra-ui/react'
17+
useDisclosure,
18+
FormControl,
19+
FormHelperText,
20+
Input
21+
} from '@chakra-ui/react'
1922

20-
const DeleteAlertDialog = ({isOpen, cancelRef, onClose, enclaveName, setEnclaveName, handleDeleteClick}) => {
23+
const DeleteAlertDialog = ({isOpen, cancelRef, onClose, enclaveToDelete, setEnclave, handleDeleteClick}) => {
2124
const [deleting, setDeleting] = useState(false);
22-
25+
const [value, setValue] = useState("")
26+
const [error, setError] = useState(false)
27+
28+
const enclaveName = enclaveToDelete.name;
2329
const handleClose = (action) => {
24-
const maybeDeleteRequest = async (action) => {
30+
31+
const clickCancel = () => {
32+
setError(false)
33+
setEnclave({})
34+
onClose()
35+
}
36+
37+
const clickDelete = async () => {
38+
setDeleting(true)
39+
await handleDeleteClick(enclaveName)
40+
setDeleting(false)
41+
setError(false)
42+
clickCancel()
43+
}
44+
45+
const maybeDeleteRequest = async () => {
2546
if (action === "delete") {
26-
setDeleting(true)
27-
await handleDeleteClick(enclaveName)
28-
setDeleting(false)
47+
if (value === enclaveName) {
48+
await clickDelete()
49+
} else {
50+
setError(true)
51+
setValue("")
52+
}
53+
} else {
54+
clickCancel()
2955
}
30-
setEnclaveName("")
31-
onClose()
3256
}
33-
maybeDeleteRequest(action)
57+
58+
maybeDeleteRequest()
59+
}
60+
61+
const handleInputChange = (val) => {
62+
if (error) {
63+
setError(false)
64+
}
65+
setValue(val)
3466
}
3567

3668
return (
3769
<AlertDialog
3870
isOpen={isOpen}
3971
leastDestructiveRef={cancelRef}
40-
onClose={onClose}
72+
onClose={ () => {
73+
setError(false)
74+
setValue("");
75+
onClose();
76+
}}
4177
isCentered
4278
>
4379
<AlertDialogOverlay>
44-
<AlertDialogContent>
45-
<AlertDialogHeader fontSize='lg'>
80+
<AlertDialogContent backgroundColor={"white"}>
81+
<AlertDialogHeader fontSize='lg' color={"black"}>
4682
Delete Enclave: <Text fontSize='lg' fontWeight='bold' as='i'> {enclaveName} </Text>
4783
</AlertDialogHeader>
4884

4985
<AlertDialogBody>
50-
Are you sure? You can't undo this action afterwards.
86+
{
87+
enclaveToDelete.mode ?
88+
<FormControl>
89+
<Input onChange={(e) => handleInputChange(e.target.value)} isInvalid={error} borderColor={"black"} color={"black"}/>
90+
<FormHelperText color={error ? "red.600" : "black"} fontSize={"sm"}>
91+
{error ?
92+
"Please verify that the input matches the enclave name" :
93+
"Enter the enclave name to delete the enclave"
94+
}
95+
</FormHelperText>
96+
</FormControl> :
97+
<Text> Are you sure? You can't undo this action afterwards. </Text>
98+
}
99+
51100
</AlertDialogBody>
52101

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

67-
const Enclave = ({name, status, created, handleClick, handleDeleteClick, onOpen, setEnclaveName}) => {
116+
const Enclave = ({name, status, handleClick, onOpen, mode, setEnclave}) => {
68117
const backgroundColor = status === 1 ? "bg-[#24BA27]" : "bg-red-500"
69118
return (
70119
<Grid
@@ -76,7 +125,7 @@ const Enclave = ({name, status, created, handleClick, handleDeleteClick, onOpen,
76125
<GridItem colSpan={4} align={"right"} style={{"zIndex":100}}>
77126
<Button bg="red.600" _hover={{ bg: "red.700"}} color="white" mr="2" onClick={(e)=> {
78127
e.stopPropagation()
79-
setEnclaveName(name)
128+
setEnclave({mode:mode, name:name})
80129
onOpen()
81130
}}> Delete </Button>
82131
</GridItem>
@@ -91,7 +140,7 @@ const Enclave = ({name, status, created, handleClick, handleDeleteClick, onOpen,
91140
)
92141
}
93142

94-
const EnclaveMainComponent = ({onOpen, enclaves, handleClick, handleDeleteClick, setEnclaveName}) => (
143+
const EnclaveMainComponent = ({onOpen, enclaves, handleClick, handleDeleteClick, setEnclave}) => (
95144
<div className='grid grid-cols-2 gap-4 flex-1'>
96145
{
97146
enclaves.map(enclave => {
@@ -104,15 +153,16 @@ const EnclaveMainComponent = ({onOpen, enclaves, handleClick, handleDeleteClick,
104153
created={enclave.created}
105154
handleClick={handleClick}
106155
handleDeleteClick={handleDeleteClick}
107-
setEnclaveName={setEnclaveName}
156+
setEnclave={setEnclave}
157+
mode={enclave.mode ? enclave.mode : false}
108158
/>
109159
)
110160
})
111161
}
112162
</div>
113163
)
114164

115-
const EnclaveComponent = ({onOpen, enclaves, handleClick, handleCreateEnvClick, handleDeleteClick, setEnclaveName}) => {
165+
const EnclaveComponent = ({onOpen, enclaves, handleClick, handleCreateEnvClick, handleDeleteClick, setEnclave}) => {
116166
return (
117167
<div className="flex-1 bg-[#171923] overflow-auto">
118168
{
@@ -132,7 +182,7 @@ const EnclaveComponent = ({onOpen, enclaves, handleClick, handleCreateEnvClick,
132182
</div>
133183
</div>
134184
:
135-
<EnclaveMainComponent setEnclaveName={setEnclaveName} onOpen={onOpen} enclaves={enclaves} handleClick={handleClick} handleDeleteClick={handleDeleteClick}/>
185+
<EnclaveMainComponent setEnclave={setEnclave} onOpen={onOpen} enclaves={enclaves} handleClick={handleClick} handleDeleteClick={handleDeleteClick}/>
136186
}
137187
</div>
138188
)
@@ -141,7 +191,7 @@ const EnclaveComponent = ({onOpen, enclaves, handleClick, handleCreateEnvClick,
141191
const Enclaves = ({enclaves, isLoading, handleDeleteClick}) => {
142192
const navigate = useNavigate()
143193
const cancelRef = useRef()
144-
const [enclaveName, setEnclaveName] = useState("")
194+
const [enclaveToDelete, setEnclave] = useState({})
145195
const { isOpen, onOpen, onClose } = useDisclosure()
146196

147197
const handleCreateEnvClick = () => {
@@ -155,15 +205,15 @@ const Enclaves = ({enclaves, isLoading, handleDeleteClick}) => {
155205
return (
156206
<div className="flex h-full flex-grow">
157207
{
158-
(isLoading) ? <LoadingOverlay/> : <EnclaveComponent setEnclaveName={setEnclaveName} onOpen={onOpen} enclaves={enclaves} handleClick={handleClick} handleCreateEnvClick={handleCreateEnvClick} handleDeleteClick={handleDeleteClick}/>
208+
(isLoading) ? <LoadingOverlay/> : <EnclaveComponent setEnclave={setEnclave} onOpen={onOpen} enclaves={enclaves} handleClick={handleClick} handleCreateEnvClick={handleCreateEnvClick} handleDeleteClick={handleDeleteClick}/>
159209
}
160210
<DeleteAlertDialog
161211
isOpen={isOpen}
162212
onOpen={onOpen}
163213
onClose={onClose}
164214
cancelRef={cancelRef}
165-
enclaveName={enclaveName}
166-
setEnclaveName={setEnclaveName}
215+
enclaveToDelete={enclaveToDelete}
216+
setEnclave={setEnclave}
167217
handleDeleteClick={handleDeleteClick}
168218
/>
169219
</div>
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
{
22
"files": {
33
"main.css": "./static/css/main.d26dfda9.css",
4-
"main.js": "./static/js/main.efccb412.js",
4+
"main.js": "./static/js/main.5a8291dc.js",
55
"index.html": "./index.html",
66
"main.d26dfda9.css.map": "./static/css/main.d26dfda9.css.map",
7-
"main.efccb412.js.map": "./static/js/main.efccb412.js.map"
7+
"main.5a8291dc.js.map": "./static/js/main.5a8291dc.js.map"
88
},
99
"entrypoints": [
1010
"static/css/main.d26dfda9.css",
11-
"static/js/main.efccb412.js"
11+
"static/js/main.5a8291dc.js"
1212
]
1313
}

engine/server/webapp/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +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>
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.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>

engine/server/webapp/static/js/main.5a8291dc.js

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

engine/server/webapp/static/js/main.efccb412.js.LICENSE.txt renamed to engine/server/webapp/static/js/main.5a8291dc.js.LICENSE.txt

File renamed without changes.

engine/server/webapp/static/js/main.5a8291dc.js.map

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

engine/server/webapp/static/js/main.efccb412.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

engine/server/webapp/static/js/main.efccb412.js.map

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)