/
k8s_actions.go
125 lines (103 loc) · 4.85 KB
/
k8s_actions.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package resources
import (
"context"
"fmt"
"net/http"
"reflect"
"k8s.io/apimachinery/pkg/api/errors"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
)
func Create(owner v1.Object, client client.Client, scheme *runtime.Scheme, clientObject client.Object) error {
reqLogger := ctrl.Log.WithName("k8s_actions").WithValues("ActiveMQArtemis Name", clientObject.GetName(), "Namespace", clientObject.GetNamespace())
objectTypeString := reflect.TypeOf(clientObject.(runtime.Object)).String()
reqLogger.V(1).Info("Creating new " + objectTypeString)
SetOwnerAndController(owner, clientObject)
var err error
if err = client.Create(context.TODO(), clientObject); err != nil {
// Add error detail for use later
reqLogger.Error(err, "Failed to create new "+objectTypeString)
} else {
reqLogger.V(1).Info("Created new " + objectTypeString)
}
if err != nil {
err = fmt.Errorf("failed to create new %s, %v", objectTypeString, err)
}
return err
}
func SetOwnerAndController(owner v1.Object, clientObject client.Object) {
reqLogger := ctrl.Log.WithName("k8s_actions").WithValues("ActiveMQArtemis Name", clientObject.GetName(), "Namespace", clientObject.GetNamespace())
gvk := owner.(runtime.Object).GetObjectKind().GroupVersionKind()
isController := true
ref := v1.OwnerReference{
APIVersion: gvk.GroupVersion().String(),
Kind: gvk.Kind,
UID: owner.GetUID(),
Name: owner.GetName(),
Controller: &isController, // ControllerManager.Owns watches match on Controller=true
}
clientObject.SetOwnerReferences([]v1.OwnerReference{ref})
reqLogger.V(1).Info("set owner-controller reference", "target", clientObject.GetObjectKind().GroupVersionKind().String(), "owner", ref)
}
func Retrieve(namespacedName types.NamespacedName, client client.Client, objectDefinition client.Object) error {
reqLogger := ctrl.Log.WithName("k8s_actions").WithValues("ActiveMQArtemis Name", namespacedName.Name)
objectTypeString := reflect.TypeOf(objectDefinition.(runtime.Object)).String()
reqLogger.V(1).Info("Retrieving " + objectTypeString)
return client.Get(context.TODO(), namespacedName, objectDefinition)
}
func Update(client client.Client, clientObject client.Object) error {
reqLogger := ctrl.Log.WithName("k8s_actions").WithValues("ActiveMQArtemis Name", clientObject.GetName(), "Namespace", clientObject.GetNamespace())
objectTypeString := reflect.TypeOf(clientObject.(runtime.Object)).String()
reqLogger.V(1).Info("Updating "+objectTypeString, "obj", clientObject)
var err error = nil
if err = client.Update(context.TODO(), clientObject); err != nil {
switch checkForForbidden := err.(type) {
case *errors.StatusError:
if checkForForbidden.ErrStatus.Status == v1.StatusFailure &&
checkForForbidden.ErrStatus.Code == http.StatusUnprocessableEntity &&
checkForForbidden.ErrStatus.Reason == v1.StatusReasonInvalid {
// "StatefulSet.apps is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', 'updateStrategy' and 'minReadySeconds' are forbidden"}
reqLogger.V(1).Info("Deleting on failed updating "+objectTypeString, "obj", clientObject, "Forbidden", err)
err = Delete(client, clientObject)
} else {
reqLogger.Error(err, "got error on update", "resourceVersion", clientObject.GetResourceVersion())
}
default:
reqLogger.Error(err, "Failed to update "+objectTypeString)
}
}
if err != nil {
err = fmt.Errorf("failed to update %s, %v", objectTypeString, err)
}
return err
}
func UpdateStatus(client client.Client, clientObject client.Object) error {
reqLogger := ctrl.Log.WithName("k8s_actions").WithValues("ActiveMQArtemis Name", clientObject.GetName(), "Namespace", clientObject.GetNamespace())
objectTypeString := reflect.TypeOf(clientObject.(runtime.Object)).String()
reqLogger.V(1).Info("Updating status "+objectTypeString, "obj", clientObject)
var err error = nil
if err = client.Status().Update(context.TODO(), clientObject); err != nil {
if errors.IsConflict(err) {
reqLogger.V(1).Info("Failed to update status on "+objectTypeString, "error", err)
} else {
reqLogger.Error(err, "Failed to update status on "+objectTypeString)
}
}
return err
}
func Delete(client client.Client, clientObject client.Object) error {
reqLogger := ctrl.Log.WithName("k8s_actions").WithValues("ActiveMQArtemis Name", clientObject.GetName(), "Namespace", clientObject.GetNamespace())
objectTypeString := reflect.TypeOf(clientObject.(runtime.Object)).String()
reqLogger.V(2).Info("Deleting " + objectTypeString)
var err error = nil
if err = client.Delete(context.TODO(), clientObject); err != nil {
reqLogger.Error(err, "Failed to delete "+objectTypeString)
}
if err != nil {
err = fmt.Errorf("failed to delete %s, %v", objectTypeString, err)
}
return err
}