-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathknockout.go
84 lines (70 loc) · 2.17 KB
/
knockout.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
package knockout
import (
"context"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/retry"
)
// TerminateNamespace finalizes a Kubernetes namespace by removing finalizers. The namespace will terminate then even if its status is 'Terminating'.
func DeleteFinalizers(resourceType, resourceName, namespace, kubeconfig string) error {
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
return err
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return err
}
ctx := context.TODO()
switch resourceType {
case "ns", "namespace":
return terminateNamespace(clientset, ctx, resourceName)
case "pvc", "pv":
return terminatePersistentVolumeClaim(clientset, ctx, resourceName)
default:
return fmt.Errorf("unsupported resource type: %s", resourceType)
}
}
// Terminates a whole namespace.
func terminateNamespace(clientset *kubernetes.Clientset, ctx context.Context, namespace string) error {
err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
ns, err := clientset.CoreV1().Namespaces().Get(ctx, namespace, metav1.GetOptions{})
if err != nil {
return err
}
ns.Finalizers = nil
_, err = clientset.CoreV1().Namespaces().Update(ctx, ns, metav1.UpdateOptions{})
return err
})
if err != nil {
return err
}
err = clientset.CoreV1().Namespaces().Delete(ctx, namespace, metav1.DeleteOptions{})
if err != nil {
return err
}
return nil
}
// Terminates a PersistentVolumeClaim.
func terminatePersistentVolumeClaim(clientset *kubernetes.Clientset, ctx context.Context, resourceName string) error {
err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
fmt.Println(resourceName)
pv, err := clientset.CoreV1().PersistentVolumes().Get(ctx, resourceName, metav1.GetOptions{})
if err != nil {
return err
}
pv.Finalizers = nil
_, err = clientset.CoreV1().PersistentVolumes().Update(ctx, pv, metav1.UpdateOptions{})
return err
})
if err != nil {
return err
}
err = clientset.CoreV1().PersistentVolumes().Delete(ctx, resourceName, metav1.DeleteOptions{})
if err != nil {
return nil
}
return nil
}