Skip to content
This repository has been archived by the owner on May 13, 2024. It is now read-only.

Commit

Permalink
feat: record events of GatewayClass and Gateway
Browse files Browse the repository at this point in the history
Signed-off-by: Lin Yang <reaver@flomesh.io>
  • Loading branch information
reaver-flomesh committed May 18, 2023
1 parent b0c6795 commit d53f5f8
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 8 deletions.
28 changes: 26 additions & 2 deletions controllers/gateway/v1beta1/gateway_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,9 @@ func (r *gatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct

// 4. update status
for _, gw := range statusChangedGateways {
if err := r.fctx.Status().Update(ctx, gw); err != nil {
return ctrl.Result{}, err
result, err := r.updateStatus(ctx, gw)
if err != nil {
return result, err
}
}

Expand Down Expand Up @@ -254,6 +255,21 @@ func (r *gatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
return ctrl.Result{}, nil
}

func (r *gatewayReconciler) updateStatus(ctx context.Context, gw *gwv1beta1.Gateway) (ctrl.Result, error) {
if err := r.fctx.Status().Update(ctx, gw); err != nil {
defer r.recorder.Eventf(gw, corev1.EventTypeWarning, "UpdateStatus", "Failed to update status of gateway: %s", err)
return ctrl.Result{}, err
}

if isAcceptedGateway(gw) {
defer r.recorder.Eventf(gw, corev1.EventTypeNormal, "Accepted", "Gateway is accepted and set as active")
} else {
defer r.recorder.Eventf(gw, corev1.EventTypeNormal, "Rejected", "Gateway in unaccepted due to it's not the oldest in namespace %s or its gatewayClassName is incorrect", gw.Namespace)
}

return ctrl.Result{}, nil
}

func gatewayIPs(gateway *gwv1beta1.Gateway) []string {
var ips []string

Expand Down Expand Up @@ -307,13 +323,19 @@ func (r *gatewayReconciler) applyGateway(gateway *gwv1beta1.Gateway) (ctrl.Resul

result, err := r.deriveCodebases(gateway, mc)
if err != nil {
defer r.recorder.Eventf(gateway, corev1.EventTypeWarning, "DeriveCodebase", "Failed to derive codebase of gateway: %s", err)

return result, err
}
defer r.recorder.Eventf(gateway, corev1.EventTypeNormal, "DeriveCodebase", "Derive codebase of gateway successfully")

result, err = r.updateConfig(gateway, mc)
if err != nil {
defer r.recorder.Eventf(gateway, corev1.EventTypeWarning, "UpdateRepo", "Failed to update repo config of gateway: %s", err)

return result, err
}
defer r.recorder.Eventf(gateway, corev1.EventTypeNormal, "UpdateRepo", "Update repo config of gateway successfully")

return r.deployGateway(gateway, mc)
}
Expand Down Expand Up @@ -341,8 +363,10 @@ func (r *gatewayReconciler) deployGateway(gw *gwv1beta1.Gateway, mc *config.Mesh
Minor: "21",
}
if ctrlResult, err := helm.RenderChart(releaseName, gw, chartSource, mc, r.fctx.Client, r.fctx.Scheme, kubeVersion, resolveValues); err != nil {
defer r.recorder.Eventf(gw, corev1.EventTypeWarning, "Deploy", "Failed to deploy gateway: %s", err)
return ctrlResult, err
}
defer r.recorder.Eventf(gw, corev1.EventTypeNormal, "Deploy", "Deploy gateway successfully")

return ctrl.Result{}, nil
}
Expand Down
39 changes: 33 additions & 6 deletions controllers/gateway/v1beta1/gatewayclass_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import (
"github.com/flomesh-io/fsm/controllers"
"github.com/flomesh-io/fsm/pkg/commons"
fctx "github.com/flomesh-io/fsm/pkg/context"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
metautil "k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand Down Expand Up @@ -96,22 +97,48 @@ func (r *gatewayClassReconciler) Reconcile(ctx context.Context, req ctrl.Request
}

// Accept all GatewayClasses those ControllerName is flomesh.io/gateway-controller
r.setAcceptedStatus(gatewayClassList, gatewayClass)
if err := r.fctx.Status().Update(ctx, gatewayClass); err != nil {
return ctrl.Result{}, err
r.setAcceptedStatus(gatewayClass)
result, err := r.updateStatus(ctx, gatewayClass, gwv1beta1.GatewayClassConditionStatusAccepted)
if err != nil {
return result, err
}

// If there's multiple GatewayClasses, the oldest is set to active and the rest are set to inactive
for _, class := range r.setActiveStatus(gatewayClassList) {
if err := r.fctx.Status().Update(ctx, class); err != nil {
return ctrl.Result{}, err
result, err := r.updateStatus(ctx, class, GatewayClassConditionStatusActive)
if err != nil {
return result, err
}
}

return ctrl.Result{}, nil
}

func (r *gatewayClassReconciler) updateStatus(ctx context.Context, class *gwv1beta1.GatewayClass, status gwv1beta1.GatewayClassConditionType) (ctrl.Result, error) {
if err := r.fctx.Status().Update(ctx, class); err != nil {
defer r.recorder.Eventf(class, corev1.EventTypeWarning, "UpdateStatus", "Failed to update status of GatewayClass: %s", err)
return ctrl.Result{}, err
}

switch status {
case gwv1beta1.GatewayClassConditionStatusAccepted:
if isAcceptedGatewayClass(class) {
defer r.recorder.Eventf(class, corev1.EventTypeNormal, "Accepted", "GatewayClass is accepted")
} else {
defer r.recorder.Eventf(class, corev1.EventTypeNormal, "Rejected", "GatewayClass is rejected")
}
case GatewayClassConditionStatusActive:
if isActiveGatewayClass(class) {
defer r.recorder.Eventf(class, corev1.EventTypeNormal, "Active", "GatewayClass is set to active")
} else {
defer r.recorder.Eventf(class, corev1.EventTypeNormal, "Inactive", "GatewayClass is set to inactive")
}
}

return ctrl.Result{}, nil
}

func (r *gatewayClassReconciler) setAcceptedStatus(list *gwv1beta1.GatewayClassList, gatewayClass *gwv1beta1.GatewayClass) {
func (r *gatewayClassReconciler) setAcceptedStatus(gatewayClass *gwv1beta1.GatewayClass) {
if gatewayClass.Spec.ControllerName == commons.GatewayController {
r.setAccepted(gatewayClass)
} else {
Expand Down

0 comments on commit d53f5f8

Please sign in to comment.