diff --git a/api/v1alpha1/orbit_types.go b/api/v1alpha1/orbit_types.go index 8f168e0..706efec 100644 --- a/api/v1alpha1/orbit_types.go +++ b/api/v1alpha1/orbit_types.go @@ -40,9 +40,11 @@ type OrbitStatus struct { Status string `json:"Status"` } +//+kubebuilder:printcolumn:JSONPath=".status.Status",name=Status,type=string //+kubebuilder:object:root=true //+kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" // Orbit is the Schema for the orbits API type Orbit struct { metav1.TypeMeta `json:",inline"` diff --git a/config/crd/bases/network.kubeorbit.io_orbits.yaml b/config/crd/bases/network.kubeorbit.io_orbits.yaml index bfe869d..0d71629 100644 --- a/config/crd/bases/network.kubeorbit.io_orbits.yaml +++ b/config/crd/bases/network.kubeorbit.io_orbits.yaml @@ -16,7 +16,14 @@ spec: singular: orbit scope: Namespaced versions: - - name: v1alpha1 + - additionalPrinterColumns: + - jsonPath: .status.Status + name: Status + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 schema: openAPIV3Schema: description: Orbit is the Schema for the orbits API diff --git a/controllers/orbit_controller.go b/controllers/orbit_controller.go index 6b565b9..ffcbd84 100644 --- a/controllers/orbit_controller.go +++ b/controllers/orbit_controller.go @@ -19,15 +19,18 @@ package controllers import ( "context" "fmt" + "log" + "github.com/google/go-cmp/cmp" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime/schema" - "log" + "k8s.io/client-go/tools/record" "github.com/go-logr/logr" "github.com/gogo/protobuf/types" "istio.io/api/networking/v1alpha3" istiov1 "istio.io/client-go/pkg/apis/networking/v1alpha3" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" orbitv1alpha1 "kubeorbit.io/api/v1alpha1" @@ -38,8 +41,9 @@ import ( // OrbitReconciler reconciles a Orbit object type OrbitReconciler struct { client.Client - Scheme *runtime.Scheme - Log logr.Logger + Scheme *runtime.Scheme + Log logr.Logger + Recorder record.EventRecorder } //+kubebuilder:rbac:groups=network.kubeorbit.io,resources=orbits,verbs=get;list;watch;create;update;patch;delete @@ -64,10 +68,20 @@ func (r *OrbitReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl log.Println(err, "unable to fetch object") } else { if err := r.reconcileEnvoyFilter(obj, req); err != nil { + obj.Status.Status = "failed" + if err := r.Status().Update(context.Background(), obj); err != nil { + log.Println(err, "unable to update status") + } + r.Recorder.Event(obj, corev1.EventTypeWarning, "FailedCreate", "Unable to create EnvoyFilter on kubeorbit") return ctrl.Result{}, fmt.Errorf("reconcileEnvoyFilter failed: %w", err) } } + obj.Status.Status = "success" + if err := r.Status().Update(context.Background(), obj); err != nil { + log.Println(err, "unable to update status") + } + r.Recorder.Event(obj, corev1.EventTypeNormal, "Created", "EnvoyFilter created successfully on kubeorbit") return ctrl.Result{}, nil } @@ -113,6 +127,7 @@ func (r *OrbitReconciler) reconcileEnvoyFilter(orbit *orbitv1alpha1.Orbit, req c clone.Spec = newSpec err = r.Update(context.TODO(), clone) if err != nil { + r.Recorder.Event(orbit, corev1.EventTypeWarning, "FailedUpdate", "Unable to update EnvoyFilter on kubeorbit") return fmt.Errorf("EnvoyFilter %s.%s update error: %w", envoyName, orbit.Namespace, err) } r.Log.WithValues("orbit", fmt.Sprintf("%s.%s", orbit.Name, orbit.Namespace)). diff --git a/main.go b/main.go index 08ece3a..ce6f8db 100644 --- a/main.go +++ b/main.go @@ -18,9 +18,7 @@ package main import ( "flag" - v1 "kubeorbit.io/api/v1" "os" - "sigs.k8s.io/controller-runtime/pkg/webhook" // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) // to ensure that exec-entrypoint and run can make use of them. @@ -33,7 +31,9 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/log/zap" + "sigs.k8s.io/controller-runtime/pkg/webhook" + v1 "kubeorbit.io/api/v1" orbitv1alpha1 "kubeorbit.io/api/v1alpha1" routev1alpha1 "kubeorbit.io/api/v1alpha1" "kubeorbit.io/controllers" @@ -84,9 +84,10 @@ func main() { } if err = (&controllers.OrbitReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: mgr.GetLogger(), + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: mgr.GetLogger(), + Recorder: mgr.GetEventRecorderFor("orbit-controller"), }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Orbit") os.Exit(1)