Skip to content

Commit c782797

Browse files
committed
Publishing events for observability
Signed-off-by: Alexey Makhov <[email protected]> Signed-off-by: makhov <[email protected]>
1 parent ee24244 commit c782797

File tree

6 files changed

+34
-1
lines changed

6 files changed

+34
-1
lines changed

cmd/main.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ func main() {
155155
os.Exit(1)
156156
}
157157

158+
recorder := mgr.GetEventRecorderFor("k0smotron")
159+
158160
restConfig, err := loadRestConfig()
159161
if err != nil {
160162
setupLog.Error(err, "unable to get cluster config")
@@ -224,6 +226,7 @@ func main() {
224226
Scheme: mgr.GetScheme(),
225227
ClientSet: clientSet,
226228
RESTConfig: restConfig,
229+
Recorder: recorder,
227230
}).SetupWithManager(mgr); err != nil {
228231
setupLog.Error(err, "unable to create controller", "controller", "K0smotronControlPlane")
229232
os.Exit(1)
@@ -233,6 +236,7 @@ func main() {
233236
Client: mgr.GetClient(),
234237
ClientSet: clientSet,
235238
RESTConfig: restConfig,
239+
Recorder: recorder,
236240
}).SetupWithManager(mgr); err != nil {
237241
setupLog.Error(err, "unable to create controller", "controller", "K0sController")
238242
os.Exit(1)
@@ -245,6 +249,7 @@ func main() {
245249
Scheme: mgr.GetScheme(),
246250
ClientSet: clientSet,
247251
RESTConfig: restConfig,
252+
Recorder: recorder,
248253
}).SetupWithManager(mgr); err != nil {
249254
setupLog.Error(err, "unable to create controller", "controller", "RemoteMachine")
250255
os.Exit(1)

config/rbac/role.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,13 @@ rules:
209209
- patch
210210
- update
211211
- watch
212+
- apiGroups:
213+
- ""
214+
resources:
215+
- events
216+
verbs:
217+
- create
218+
- patch
212219
- apiGroups:
213220
- ""
214221
resources:

internal/controller/controlplane/k0s_controlplane_controller.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626

2727
"k8s.io/apimachinery/pkg/api/meta"
2828
"k8s.io/apimachinery/pkg/runtime/schema"
29+
"k8s.io/client-go/tools/record"
2930

3031
"github.com/go-logr/logr"
3132
"github.com/google/uuid"
@@ -77,6 +78,7 @@ type K0sController struct {
7778
client.Client
7879
ClientSet *kubernetes.Clientset
7980
RESTConfig *rest.Config
81+
Recorder record.EventRecorder
8082
// workloadClusterKubeClient is used during testing to inject a fake client
8183
workloadClusterKubeClient *kubernetes.Clientset
8284
}
@@ -86,6 +88,7 @@ type K0sController struct {
8688
// +kubebuilder:rbac:groups=core,resources=nodes,verbs=get;list
8789
// +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=*,verbs=get;list;watch;create;update;patch;delete
8890
// +kubebuilder:rbac:groups=cluster.x-k8s.io,resources=clusters;clusters/status,verbs=get;list;watch;update;patch
91+
// +kubebuilder:rbac:groups=core,resources=events,verbs=create;patch
8992

9093
func (c *K0sController) Reconcile(ctx context.Context, req ctrl.Request) (res ctrl.Result, err error) {
9194
log := log.FromContext(ctx).WithValues("controlplane", req.NamespacedName)
@@ -173,6 +176,11 @@ func (c *K0sController) Reconcile(ctx context.Context, req ctrl.Request) (res ct
173176
if perr := c.Client.Patch(ctx, cluster, client.Merge); perr != nil {
174177
err = fmt.Errorf("failed to patch cluster: %w", perr)
175178
}
179+
180+
// If the control plane became ready, emit an event
181+
if existingStatus.Ready != kcp.Status.Ready {
182+
c.Recorder.Eventf(kcp, corev1.EventTypeNormal, "ControlPlaneReady", "K0sControlPlane %s is ready", kcp.Name)
183+
}
176184
}
177185

178186
// Requeue the reconciliation if the status is not ready
@@ -236,6 +244,7 @@ func (c *K0sController) reconcileKubeconfig(ctx context.Context, cluster *cluste
236244
logger.Error(err, "Failed to regenerate kubeconfig")
237245
return
238246
}
247+
c.Recorder.Eventf(kcp, corev1.EventTypeNormal, "Provisioning", "Kubeconfig for control plane %s regenerated", kcp.Name)
239248
}
240249
}
241250
}()

internal/controller/controlplane/k0s_controlplane_controller_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,8 @@ func TestReconcileKubeconfigCertsRotation(t *testing.T) {
710710
require.NoError(t, cc.LookupOrGenerate(ctx, testEnv, capiutil.ObjectKey(cluster), *metav1.NewControllerRef(kcp, cpv1beta1.GroupVersion.WithKind("K0sControlPlane"))))
711711

712712
r := &K0sController{
713-
Client: testEnv,
713+
Client: testEnv,
714+
Recorder: testEnv.GetEventRecorderFor("k0smotron"),
714715
}
715716
err = r.reconcileKubeconfig(ctx, cluster, kcp)
716717
require.NoError(t, err)

internal/controller/controlplane/k0smotron_controlplane_controller.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"k8s.io/apimachinery/pkg/util/wait"
3232
"k8s.io/client-go/kubernetes"
3333
"k8s.io/client-go/rest"
34+
"k8s.io/client-go/tools/record"
3435
"sigs.k8s.io/cluster-api/controllers/remote"
3536

3637
apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -57,6 +58,7 @@ type K0smotronController struct {
5758
Scheme *runtime.Scheme
5859
ClientSet *kubernetes.Clientset
5960
RESTConfig *rest.Config
61+
Recorder record.EventRecorder
6062
}
6163

6264
type Scope struct {
@@ -315,6 +317,8 @@ func (c *K0smotronController) reconcile(ctx context.Context, cluster *clusterv1.
315317
return ctrl.Result{}, foundCluster.Status.Ready, nil
316318
}
317319

320+
c.Recorder.Event(kcp, corev1.EventTypeNormal, "Reconciling", "Reconciling K0smotronControlPlane")
321+
318322
return ctrl.Result{}, false, err
319323
}
320324

internal/controller/infrastructure/remote_machine_controller.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package infrastructure
1919
import (
2020
"context"
2121
"fmt"
22+
"k8s.io/client-go/tools/record"
2223

2324
v1 "k8s.io/api/core/v1"
2425
"k8s.io/apimachinery/pkg/runtime"
@@ -49,6 +50,7 @@ type RemoteMachineController struct {
4950
Scheme *runtime.Scheme
5051
ClientSet *kubernetes.Clientset
5152
RESTConfig *rest.Config
53+
Recorder record.EventRecorder
5254
}
5355

5456
type RemoteMachineMode int
@@ -314,6 +316,8 @@ func (r *RemoteMachineController) reservePooledMachine(ctx context.Context, rm *
314316
}
315317
}
316318

319+
r.Recorder.Eventf(rm, v1.EventTypeNormal, "Reserved", "Reserved machine %s from pool %s", foundPooledMachine.Name, foundPooledMachine.Spec.Pool)
320+
317321
rm.Spec.Address = foundPooledMachine.Spec.Machine.Address
318322
rm.Spec.Port = foundPooledMachine.Spec.Machine.Port
319323
rm.Spec.User = foundPooledMachine.Spec.Machine.User
@@ -347,6 +351,9 @@ func (r *RemoteMachineController) returnMachineToPool(ctx context.Context, rm *i
347351
if err := r.Status().Update(ctx, &pooledMachine); err != nil {
348352
return fmt.Errorf("failed to update pooled machine: %w", err)
349353
}
354+
355+
r.Recorder.Eventf(rm, v1.EventTypeNormal, "Returned", "Returned machine %s to pool %s", pooledMachine.Name, pool)
356+
350357
return nil
351358
}
352359
}

0 commit comments

Comments
 (0)