Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions cmd/controller/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package main
import (
"flag"
"os"
"strings"
"time"

"k8s.io/apimachinery/pkg/runtime"
Expand All @@ -21,11 +22,23 @@ import (
"github.com/bootc-dev/bootc-operator/internal/version"
)

const namespacePath = "/var/run/secrets/kubernetes.io/serviceaccount/namespace"

var (
scheme = runtime.NewScheme()
setupLog = ctrl.Log.WithName("setup")
)

func detectNamespace() string {
if ns := os.Getenv("POD_NAMESPACE"); ns != "" {
return ns
}
if data, err := os.ReadFile(namespacePath); err == nil {
return strings.TrimSpace(string(data))
}
return ""
}

func init() {
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
utilruntime.Must(bootcv1alpha1.AddToScheme(scheme))
Expand Down Expand Up @@ -96,6 +109,7 @@ func main() {
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
KubeClient: kubeClient,
EventNamespace: detectNamespace(),
TagResolver: &registry.GGCRResolver{AllowInsecure: allowInsecureRegistry},
TagResolutionInterval: tagResolutionInterval,
}).SetupWithManager(mgr); err != nil {
Expand Down
5 changes: 5 additions & 0 deletions config/manager/manager.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ spec:
- --health-probe-bind-address=:8081
image: ghcr.io/bootc-dev/bootc-operator:latest
name: manager
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- containerPort: 8081
name: health
Expand Down
4 changes: 4 additions & 0 deletions internal/controller/bootcnodepool_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ type BootcNodePoolReconciler struct {
KubeClient kubernetes.Interface
Recorder events.EventRecorder

// EventNamespace is the namespace where events for cluster-scoped
// resources are created. Without this, client-go defaults to "default".
EventNamespace string

TagResolver TagResolver
TagResolutionInterval time.Duration

Expand Down
14 changes: 14 additions & 0 deletions internal/controller/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -420,9 +420,23 @@ func (r *BootcNodePoolReconciler) recordEvent(
eventType, reason, action string,
note EventNote,
) {
if r.EventNamespace != "" {
regarding = withNamespace(regarding, r.EventNamespace)
if related != nil {
related = withNamespace(related, r.EventNamespace)
}
}
r.Recorder.Eventf(regarding, related, eventType, reason, action, "%s", note.Note())
}

func withNamespace(obj runtime.Object, ns string) runtime.Object {
c := obj.DeepCopyObject()
if o, ok := c.(metav1.Object); ok {
o.SetNamespace(ns)
}
return c
}

// capNote keeps a note within the events.k8s.io/v1 1 KiB limit and never splits
// a UTF-8 sequence. It is only needed for notes built from unbounded free text
// (condition messages, error strings); notes assembled from bounded fields fit
Expand Down
2 changes: 1 addition & 1 deletion internal/controller/events_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -855,7 +855,7 @@ func eventsForObject(
if err := k8sClient.List(
ctx,
&eventList,
client.InNamespace(metav1.NamespaceDefault),
client.InNamespace(testutil.OperatorNamespaceName),
); err != nil {
return nil, err
}
Expand Down
16 changes: 13 additions & 3 deletions internal/controller/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import (
"path/filepath"
"testing"

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
ctrl "sigs.k8s.io/controller-runtime"
Expand All @@ -18,6 +20,7 @@ import (
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"

bootcv1alpha1 "github.com/bootc-dev/bootc-operator/api/v1alpha1"
testutil "github.com/bootc-dev/bootc-operator/test/util"
)

var (
Expand Down Expand Up @@ -74,10 +77,17 @@ func TestMain(m *testing.M) {
os.Exit(1)
}

ns := &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: testutil.OperatorNamespaceName}}
if err := k8sClient.Create(context.Background(), ns); err != nil {
fmt.Fprintf(os.Stderr, "Failed to create event namespace: %v\n", err)
os.Exit(1)
}

testReconciler = &BootcNodePoolReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
KubeClient: kubeClient,
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
KubeClient: kubeClient,
EventNamespace: testutil.OperatorNamespaceName,
}
if err := testReconciler.SetupWithManager(mgr); err != nil {
fmt.Fprintf(os.Stderr, "Failed to setup reconciler: %v\n", err)
Expand Down
4 changes: 3 additions & 1 deletion test/e2e/bootcnode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -937,7 +937,9 @@ func fetchEvents(
) func() ([]eventsv1.Event, error) {
return func() ([]eventsv1.Event, error) {
var eventList eventsv1.EventList
if err := c.List(ctx, &eventList); err != nil {
if err := c.List(ctx, &eventList,
client.InNamespace(testutil.OperatorNamespaceName),
); err != nil {
return nil, err
}

Expand Down
Loading