-
Notifications
You must be signed in to change notification settings - Fork 104
/
task_delete.go
89 lines (75 loc) · 2.37 KB
/
task_delete.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package task
import (
"context"
"fmt"
"log"
"github.com/kudobuilder/kudo/pkg/engine/health"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/kudobuilder/kudo/pkg/engine/resource"
)
// DeleteTask will delete a set of given resources from the cluster. See Run method for more details.
type DeleteTask struct {
Name string
Resources []string
}
// Run method for the DeleteTask. Given the task context, it renders the templates using context parameters
// creates runtime objects and enhances them, and finally removes them using the controller client.
func (dt DeleteTask) Run(ctx Context) (bool, error) {
// 1. - Render task templates -
rendered, err := render(dt.Resources, ctx)
if err != nil {
return false, fatalExecutionError(err, taskRenderingError, ctx.Meta)
}
// 2. - Convert to objs
objs, err := convert(rendered)
if err != nil {
return false, fatalExecutionError(err, taskRenderingError, ctx.Meta)
}
// 3. - Filter unknown objects
objs, err = filterUnknownObjectTypes(objs, ctx)
if err != nil {
return false, fatalExecutionError(err, taskRenderingError, ctx.Meta)
}
// 4. - Enhance objects, required for namespaces
objs, err = ctx.Enhancer.Apply(objs, ctx.Meta)
if err != nil {
return false, err
}
// 5. - Delete them using the client -
err = deleteResource(objs, ctx.Client)
if err != nil {
return false, err
}
// 6. - Check health: always true for Delete task -
err = health.IsDeleted(ctx.Client, ctx.Discovery, objs)
if err != nil {
log.Printf("TaskExecution: %v", err)
return false, nil
}
return true, nil
}
func filterUnknownObjectTypes(objs []runtime.Object, ctx Context) ([]runtime.Object, error) {
knownObjs := make([]runtime.Object, 0)
for _, o := range objs {
isKnown, err := resource.IsKnownObjectType(o, ctx.Discovery)
if err != nil {
return nil, fmt.Errorf("failed to detect if object type is known for %s: %v", o.GetObjectKind(), err)
}
if isKnown {
knownObjs = append(knownObjs, o)
}
}
return knownObjs, nil
}
func deleteResource(ro []runtime.Object, c client.Client) error {
for _, r := range ro {
err := c.Delete(context.TODO(), r, client.PropagationPolicy(metav1.DeletePropagationForeground))
if !apierrors.IsNotFound(err) && err != nil {
return err
}
}
return nil
}