forked from JamesLaverack/kubernetes-minecraft-operator
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontroller.go
More file actions
106 lines (91 loc) · 3 KB
/
Copy pathcontroller.go
File metadata and controls
106 lines (91 loc) · 3 KB
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
package minecraftserver
import (
"context"
"go.uber.org/zap"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
minecraftv1alpha1 "github.com/jameslaverack/kubernetes-minecraft-operator/api/v1alpha1"
"github.com/jameslaverack/kubernetes-minecraft-operator/pkg/logutil"
)
type MinecraftServerReconciler struct {
client.Client
Scheme *runtime.Scheme
}
func (r *MinecraftServerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := logutil.FromContextOrNew(ctx).With(
zap.String("name", req.Name),
zap.String("namespace", req.Namespace),
zap.String("controller", "MinecraftServer"))
ctx = logutil.IntoContext(ctx, log)
log.Info("beginning reconciliation")
// Go back to the API server with a get to find the full definition of the MinecraftServer object (we're only given
// the name and namespace at this point). We also might fail to find it, as we might have been triggered to
// reconcile because the object was deleted. In this case we don't need to do any cleanup, as we set the owner
// references on every other object we create so the API server's normal cascading delete behaviour will clean up
// everything.
var server minecraftv1alpha1.MinecraftServer
if err := r.Get(ctx, req.NamespacedName, &server); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
// We'll now create each resource we need. In general we'll "reconcile" each resource in turn. If there's work to be
// done we'll do it an exit instantly. This is because this function is triggered on changes to owned resources, so
// the act of creating or modifying an owned resource will cause this function to be called again anyway.
done, err := ConfigMap(ctx, r.Client, &server)
if err != nil {
return ctrl.Result{}, err
}
if done {
return ctrl.Result{}, nil
}
if server.Spec.Dynmap != nil && server.Spec.Dynmap.Enabled {
done, err := DynmapConfigMap(ctx, r.Client, &server)
if err != nil {
return ctrl.Result{}, err
}
if done {
return ctrl.Result{}, nil
}
done, err = DynmapService(ctx, r.Client, &server)
if err != nil {
return ctrl.Result{}, err
}
if done {
return ctrl.Result{}, nil
}
}
done, err = Service(ctx, r.Client, &server)
if err != nil {
return ctrl.Result{}, err
}
if done {
return ctrl.Result{}, nil
}
done, err = RCONService(ctx, r.Client, &server)
if err != nil {
return ctrl.Result{}, err
}
if done {
return ctrl.Result{}, nil
}
done, err = ReplicaSet(ctx, r.Client, &server)
if err != nil {
return ctrl.Result{}, err
}
if done {
return ctrl.Result{}, nil
}
// All good, return
log.Info("All good")
return ctrl.Result{}, nil
}
func (r *MinecraftServerReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&minecraftv1alpha1.MinecraftServer{}).
Owns(&corev1.ConfigMap{}).
Owns(&corev1.Service{}).
Owns(&appsv1.ReplicaSet{}).
Complete(r)
}