feat: add delete functionality for namespace resources
This commit is contained in:
@@ -198,6 +198,10 @@ export default function K8sResourceList() {
|
|||||||
try {
|
try {
|
||||||
let endpoint = '';
|
let endpoint = '';
|
||||||
let kind = '';
|
let kind = '';
|
||||||
|
let requestBody = {
|
||||||
|
name: deleteTarget.name,
|
||||||
|
namespace: deleteTarget.namespace
|
||||||
|
};
|
||||||
|
|
||||||
// Determine the correct endpoint based on the selected resource kind
|
// Determine the correct endpoint based on the selected resource kind
|
||||||
switch (selectedKind.key) {
|
switch (selectedKind.key) {
|
||||||
@@ -221,6 +225,12 @@ export default function K8sResourceList() {
|
|||||||
endpoint = '/api/v1/k8s/configmap/delete'
|
endpoint = '/api/v1/k8s/configmap/delete'
|
||||||
kind = 'ConfigMap'
|
kind = 'ConfigMap'
|
||||||
break
|
break
|
||||||
|
case 'namespace':
|
||||||
|
endpoint = '/api/v1/k8s/namespace/delete'
|
||||||
|
kind = 'Namespace'
|
||||||
|
// Namespace doesn't need namespace field
|
||||||
|
requestBody = { name: deleteTarget.name }
|
||||||
|
break
|
||||||
default:
|
default:
|
||||||
throw new Error(`Unsupported resource kind: ${selectedKind.key}`)
|
throw new Error(`Unsupported resource kind: ${selectedKind.key}`)
|
||||||
}
|
}
|
||||||
@@ -228,10 +238,7 @@ export default function K8sResourceList() {
|
|||||||
const res = await fetch(endpoint, {
|
const res = await fetch(endpoint, {
|
||||||
method: 'DELETE',
|
method: 'DELETE',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify({
|
body: JSON.stringify(requestBody),
|
||||||
name: deleteTarget.name,
|
|
||||||
namespace: deleteTarget.namespace
|
|
||||||
}),
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const result = await res.json()
|
const result = await res.json()
|
||||||
@@ -381,7 +388,7 @@ export default function K8sResourceList() {
|
|||||||
const getResourceColumns = () => {
|
const getResourceColumns = () => {
|
||||||
switch (selectedKind.key) {
|
switch (selectedKind.key) {
|
||||||
case 'namespace':
|
case 'namespace':
|
||||||
return ['Name', 'Status', 'Age']
|
return ['Name', 'Status', 'Age', 'Actions']
|
||||||
case 'deployment':
|
case 'deployment':
|
||||||
case 'statefulset':
|
case 'statefulset':
|
||||||
return ['Name', 'Namespace', 'Replicas', 'Age', 'Actions']
|
return ['Name', 'Namespace', 'Replicas', 'Age', 'Actions']
|
||||||
@@ -421,6 +428,17 @@ export default function K8sResourceList() {
|
|||||||
<TableCell>{metadata.name || '-'}</TableCell>
|
<TableCell>{metadata.name || '-'}</TableCell>
|
||||||
<TableCell>{status.phase || '-'}</TableCell>
|
<TableCell>{status.phase || '-'}</TableCell>
|
||||||
<TableCell>{getAge(metadata.creationTimestamp)}</TableCell>
|
<TableCell>{getAge(metadata.creationTimestamp)}</TableCell>
|
||||||
|
<TableCell>
|
||||||
|
<Tooltip title="删除">
|
||||||
|
<IconButton
|
||||||
|
size="small"
|
||||||
|
color="error"
|
||||||
|
onClick={() => openDeleteDialog(metadata.name, metadata.namespace)}
|
||||||
|
>
|
||||||
|
<DeleteIcon fontSize="small" />
|
||||||
|
</IconButton>
|
||||||
|
</Tooltip>
|
||||||
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
)
|
)
|
||||||
case 'deployment':
|
case 'deployment':
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ func Init(ctx context.Context, address string, db *gorm.DB, store store.Store) (
|
|||||||
k8sAPI.Post("/resource/update", k8s.K8sResourceUpdate(ctx, db, store))
|
k8sAPI.Post("/resource/update", k8s.K8sResourceUpdate(ctx, db, store))
|
||||||
// resource list
|
// resource list
|
||||||
k8sAPI.Get("/namespace/list", k8s.K8sNamespaceList(ctx, db, store))
|
k8sAPI.Get("/namespace/list", k8s.K8sNamespaceList(ctx, db, store))
|
||||||
|
k8sAPI.Delete("/namespace/delete", k8s.K8sNamespaceDelete(ctx, db, store))
|
||||||
k8sAPI.Get("/deployment/list", k8s.K8sDeploymentList(ctx, db, store))
|
k8sAPI.Get("/deployment/list", k8s.K8sDeploymentList(ctx, db, store))
|
||||||
k8sAPI.Delete("/deployment/delete", k8s.K8sDeploymentDelete(ctx, db, store))
|
k8sAPI.Delete("/deployment/delete", k8s.K8sDeploymentDelete(ctx, db, store))
|
||||||
k8sAPI.Get("/statefulset/list", k8s.K8sStatefulSetList(ctx, db, store))
|
k8sAPI.Get("/statefulset/list", k8s.K8sStatefulSetList(ctx, db, store))
|
||||||
|
|||||||
@@ -927,3 +927,33 @@ func K8sConfigMapDelete(ctx context.Context, db *gorm.DB, store store.Store) fib
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func K8sNamespaceDelete(ctx context.Context, db *gorm.DB, store store.Store) fiber.Handler {
|
||||||
|
return func(c fiber.Ctx) error {
|
||||||
|
var req struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := json.Unmarshal(c.Body(), &req); err != nil {
|
||||||
|
return resp.R400(c, "", nil, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.Name == "" {
|
||||||
|
return resp.R400(c, "", nil, fmt.Errorf("name is required"))
|
||||||
|
}
|
||||||
|
|
||||||
|
clientset, err := getK8sClient(db)
|
||||||
|
if err != nil {
|
||||||
|
return resp.R500(c, "", nil, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = clientset.CoreV1().Namespaces().Delete(c.Context(), req.Name, metav1.DeleteOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return resp.R500(c, "", nil, fmt.Errorf("failed to delete namespace: %w", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp.R200(c, map[string]any{
|
||||||
|
"name": req.Name,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user