Skip to content
This repository was archived by the owner on Dec 16, 2025. It is now read-only.

Commit c1900a7

Browse files
🐛 Fix events recording (#50)
* Fix events recording CSPO controllers record multiple events to the resources they manage. However, these events were not recorded in CRs. Fixes: #47 Signed-off-by: Matej Feder <[email protected]> * Apply suggestions from code review Co-authored-by: Roman Hros <[email protected]> Signed-off-by: Matej Feder <[email protected]> --------- Signed-off-by: Matej Feder <[email protected]> Co-authored-by: Roman Hros <[email protected]>
1 parent 74318e1 commit c1900a7

File tree

4 files changed

+24
-9
lines changed

4 files changed

+24
-9
lines changed

cmd/main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
3232
// to ensure that exec-entrypoint and run can make use of them.
3333
_ "k8s.io/client-go/plugin/pkg/client/auth"
34+
"sigs.k8s.io/cluster-api/util/record"
3435
ctrl "sigs.k8s.io/controller-runtime"
3536
"sigs.k8s.io/controller-runtime/pkg/cache"
3637
"sigs.k8s.io/controller-runtime/pkg/healthz"
@@ -102,6 +103,9 @@ func main() {
102103
os.Exit(1)
103104
}
104105

106+
// Initialize event recorder.
107+
record.InitFromRecorder(mgr.GetEventRecorderFor("cspo-controller"))
108+
105109
gitFactory := githubclient.NewFactory()
106110

107111
if err = (&controller.OpenStackClusterStackReleaseReconciler{

config/rbac/role.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ kind: ClusterRole
44
metadata:
55
name: manager-role
66
rules:
7+
- apiGroups:
8+
- ""
9+
resources:
10+
- events
11+
verbs:
12+
- create
13+
- patch
714
- apiGroups:
815
- ""
916
resources:

internal/controller/openstackclusterstackrelease_controller.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ const (
6868
//+kubebuilder:rbac:groups=infrastructure.clusterstack.x-k8s.io,resources=openstackclusterstackreleases,verbs=get;list;watch;create;update;patch;delete
6969
//+kubebuilder:rbac:groups=infrastructure.clusterstack.x-k8s.io,resources=openstackclusterstackreleases/status,verbs=get;update;patch
7070
//+kubebuilder:rbac:groups=infrastructure.clusterstack.x-k8s.io,resources=openstackclusterstackreleases/finalizers,verbs=update
71+
//+kubebuilder:rbac:groups="",resources=events,verbs=create;patch
7172

7273
// Reconcile is part of the main kubernetes reconciliation loop which aims to
7374
// move the current state of the cluster closer to the desired state.
@@ -148,6 +149,7 @@ func (r *OpenStackClusterStackReleaseReconciler) Reconcile(ctx context.Context,
148149

149150
r.openStackClusterStackRelDownloadDirectoryMutex.Unlock()
150151

152+
record.Eventf(openstackclusterstackrelease, "ClusterStackReleaseAssetsReady", "successfully downloaded ClusterStackReleaseAssets %q", releaseTag)
151153
// requeue to make sure release assets can be accessed
152154
return ctrl.Result{Requeue: true}, nil
153155
}
@@ -174,7 +176,7 @@ func (r *OpenStackClusterStackReleaseReconciler) Reconcile(ctx context.Context,
174176
osnirName := fmt.Sprintf("%s-%s-%s", nameWithoutVersion, openStackNodeImage.CreateOpts.Name, nodeImageVersion)
175177

176178
if err := r.createOrUpdateOpenStackNodeImageRelease(ctx, openstackclusterstackrelease, osnirName, openStackNodeImage, ownerRef); err != nil {
177-
return ctrl.Result{}, fmt.Errorf("failed to get or create OpenStackNodeImageRelease %s/%s: %w", openstackclusterstackrelease.Namespace, osnirName, err)
179+
return ctrl.Result{}, fmt.Errorf("failed to create or update OpenStackNodeImageRelease %s/%s: %w", openstackclusterstackrelease.Namespace, osnirName, err)
178180
}
179181
}
180182

@@ -210,6 +212,7 @@ func (r *OpenStackClusterStackReleaseReconciler) Reconcile(ctx context.Context,
210212

211213
logger.Info("OpenStackClusterStackRelease **ready**")
212214
conditions.MarkTrue(openstackclusterstackrelease, apiv1alpha1.OpenStackNodeImageReleasesReadyCondition)
215+
record.Eventf(openstackclusterstackrelease, "OpenStackNodeImageReleasesReady", "OpenStackNodeImageRelease objects are ready")
213216
openstackclusterstackrelease.Status.Ready = true
214217

215218
return ctrl.Result{}, nil
@@ -226,10 +229,7 @@ func (r *OpenStackClusterStackReleaseReconciler) createOrUpdateOpenStackNodeImag
226229
openStackNodeImageRelease.SetOwnerReferences(util.EnsureOwnerRef(openStackNodeImageRelease.GetOwnerReferences(), *ownerRef))
227230

228231
if err := r.Update(ctx, openStackNodeImageRelease); err != nil {
229-
record.Eventf(openStackNodeImageRelease,
230-
"ErrorOpenStackNodeImageRelease",
231-
"failed to update %s OpenStackNodeImageRelease: %s", osnirName, err.Error(),
232-
)
232+
record.Warnf(openStackNodeImageRelease, "FailedUpdateOpenStackNodeImageRelease", err.Error())
233233
return fmt.Errorf("failed to update OpenStackNodeImageRelease: %w", err)
234234
}
235235

@@ -254,11 +254,11 @@ func (r *OpenStackClusterStackReleaseReconciler) createOrUpdateOpenStackNodeImag
254254
openStackNodeImageRelease.Spec.IdentityRef = openstackclusterstackrelease.Spec.IdentityRef
255255

256256
if err := r.Create(ctx, openStackNodeImageRelease); err != nil {
257-
record.Warnf(openStackNodeImageRelease, "ErrorOpenStackNodeImageRelease", err.Error())
257+
record.Warnf(openStackNodeImageRelease, "FailedCreateOpenStackNodeImageRelease", err.Error())
258258
return fmt.Errorf("failed to create OpenStackNodeImageRelease: %w", err)
259259
}
260260

261-
record.Eventf(openStackNodeImageRelease, "OpenStackNodeImageReleaseCreated", "successfully created OpenStackNodeImageRelease object %q", osnirName)
261+
record.Eventf(openstackclusterstackrelease, "OpenStackNodeImageReleaseCreated", "successfully created OpenStackNodeImageRelease object %q", osnirName)
262262
return nil
263263
}
264264

internal/controller/openstacknodeimagerelease_controller.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ const (
5858
//+kubebuilder:rbac:groups=infrastructure.clusterstack.x-k8s.io,resources=openstacknodeimagereleases/status,verbs=get;update;patch
5959
//+kubebuilder:rbac:groups=infrastructure.clusterstack.x-k8s.io,resources=openstacknodeimagereleases/finalizers,verbs=update
6060
//+kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch;update
61+
//+kubebuilder:rbac:groups="",resources=events,verbs=create;patch
6162

6263
// Reconcile is part of the main kubernetes reconciliation loop which aims to
6364
// move the current state of the cluster closer to the desired state.
@@ -160,6 +161,7 @@ func (r *OpenStackNodeImageReleaseReconciler) Reconcile(ctx context.Context, req
160161
if imageID == "" {
161162
conditions.MarkFalse(openstacknodeimagerelease, apiv1alpha1.OpenStackImageReadyCondition, apiv1alpha1.OpenStackImageNotCreatedYetReason, clusterv1beta1.ConditionSeverityInfo, "image is not created yet")
162163
conditions.MarkFalse(openstacknodeimagerelease, apiv1alpha1.OpenStackImageImportStartedCondition, apiv1alpha1.OpenStackImageImportNotStartReason, clusterv1beta1.ConditionSeverityInfo, "image import not start yet")
164+
record.Eventf(openstacknodeimagerelease, "OpenStackImageImportStarted", "image is neither created nor imported yet %q", openstacknodeimagerelease.Spec.Image.CreateOpts.Name)
163165
openstacknodeimagerelease.Status.Ready = false
164166

165167
imageCreateOpts := openstacknodeimagerelease.Spec.Image.CreateOpts
@@ -175,6 +177,7 @@ func (r *OpenStackNodeImageReleaseReconciler) Reconcile(ctx context.Context, req
175177
logger.Error(err, "failed to create an image")
176178
return ctrl.Result{}, nil
177179
}
180+
record.Eventf(openstacknodeimagerelease, "OpenStackImageCreated", "successfully created an image %q, ID %q", openstacknodeimagerelease.Spec.Image.CreateOpts.Name, imageCreated.ID)
178181

179182
imageImportOpts := imageimport.CreateOpts{
180183
Name: imageimport.WebDownloadMethod,
@@ -194,6 +197,8 @@ func (r *OpenStackNodeImageReleaseReconciler) Reconcile(ctx context.Context, req
194197
}
195198

196199
conditions.MarkTrue(openstacknodeimagerelease, apiv1alpha1.OpenStackImageImportStartedCondition)
200+
record.Eventf(openstacknodeimagerelease, "OpenStackImageImportStarted", "successfully started an image import %q, ID %q", openstacknodeimagerelease.Spec.Image.CreateOpts.Name, imageCreated.ID)
201+
197202
// requeue to make sure that image ID can be found via image name
198203
return ctrl.Result{Requeue: true}, nil
199204
}
@@ -242,6 +247,7 @@ func (r *OpenStackNodeImageReleaseReconciler) Reconcile(ctx context.Context, req
242247
logger.Info("OpenStackNodeImageRelease **ready** - image is **ACTIVE**.", "name", openstacknodeimagerelease.Spec.Image.CreateOpts.Name, "ID", imageID)
243248
conditions.MarkTrue(openstacknodeimagerelease, apiv1alpha1.OpenStackImageReadyCondition)
244249
openstacknodeimagerelease.Status.Ready = true
250+
record.Eventf(openstacknodeimagerelease, "OpenStackImageActive", "image status is ACTIVE %q, ID %q", openstacknodeimagerelease.Spec.Image.CreateOpts.Name, imageID)
245251

246252
case images.ImageStatusDeactivated, images.ImageStatusKilled:
247253
// These statuses are unexpected. Hence we set a failure for them. See the explanation below:
@@ -257,7 +263,6 @@ func (r *OpenStackNodeImageReleaseReconciler) Reconcile(ctx context.Context, req
257263
openstacknodeimagerelease.Status.Ready = false
258264
record.Warnf(openstacknodeimagerelease, "OpenStackImageStatusUnexpected", err.Error())
259265
logger.Error(err, "unexpected image status")
260-
return ctrl.Result{}, nil
261266

262267
case images.ImageStatusQueued, images.ImageStatusSaving, images.ImageStatusDeleted, images.ImageStatusPendingDelete, images.ImageStatusImporting:
263268
// The other statuses are expected. See the explanation below:
@@ -281,7 +286,6 @@ func (r *OpenStackNodeImageReleaseReconciler) Reconcile(ctx context.Context, req
281286
openstacknodeimagerelease.Status.Ready = false
282287
record.Warnf(openstacknodeimagerelease, "OpenStackImageStatusUnknown", err.Error())
283288
logger.Error(err, "unknown image status")
284-
return ctrl.Result{}, nil
285289
}
286290

287291
return ctrl.Result{}, nil

0 commit comments

Comments
 (0)