/
delete_handler.go
63 lines (52 loc) · 1.45 KB
/
delete_handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package actions
import (
"context"
"fmt"
"reflect"
"github.com/sirupsen/logrus"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
"github.com/castai/cluster-controller/castai"
)
type deleteHandler struct {
log logrus.FieldLogger
client dynamic.Interface
}
func newDeleteHandler(log logrus.FieldLogger, client dynamic.Interface) ActionHandler {
return &deleteHandler{
log: log,
client: client,
}
}
func (h *deleteHandler) Handle(ctx context.Context, action *castai.ClusterAction) error {
req, ok := action.Data().(*castai.ActionDelete)
if !ok {
return newUnexpectedTypeErr(action.Data(), req)
}
log := h.log.WithFields(logrus.Fields{
"id": action.ID,
"action": reflect.TypeOf(action.Data()).String(),
"gvr": req.ID.GroupVersionResource.String(),
"name": req.ID.Name,
})
r := h.client.Resource(schema.GroupVersionResource{
Group: req.ID.Group,
Version: req.ID.Version,
Resource: req.ID.Resource,
})
var res dynamic.ResourceInterface = r
if req.ID.Namespace != nil {
res = r.Namespace(*req.ID.Namespace)
}
log.Info("deleting resource")
if err := res.Delete(ctx, req.ID.Name, metav1.DeleteOptions{}); err != nil {
if apierrors.IsNotFound(err) {
log.Info("resource not found, skipping deletion")
return nil
}
return fmt.Errorf("deleting resource %v: %w", req.ID.Name, err)
}
return nil
}