in pkg/providers/gateway/gateway.go [84:161]
func (c *gatewayController) sync(ctx context.Context, ev *types.Event) error {
key := ev.Object.(string)
namespace, name, err := cache.SplitMetaNamespaceKey(key)
if err != nil {
log.Errorw("found Gateway resource with invalid meta namespace key",
zap.Error(err),
zap.String("key", key),
)
return err
}
gateway, err := c.controller.gatewayLister.Gateways(namespace).Get(name)
if err != nil {
if !k8serrors.IsNotFound(err) {
log.Errorw("failed to get Gateway",
zap.Error(err),
zap.String("key", key),
)
return err
}
if ev.Type != types.EventDelete {
log.Warnw("Gateway was deleted before it can be delivered",
zap.String("key", key),
)
// Don't need to retry.
return nil
}
}
if ev.Type == types.EventDelete {
if gateway != nil {
// We still find the resource while we are processing the DELETE event,
// that means object with same namespace and name was created, discarding
// this stale DELETE event.
log.Warnw("discard the stale Gateway delete event since it exists",
zap.String("key", key),
)
return nil
}
gateway = ev.Tombstone.(*gatewayv1beta1.Gateway)
err = c.controller.RemoveListeners(gateway.Namespace, gateway.Name)
if err != nil {
return err
}
} else {
gatewayClassName := string(gateway.Spec.GatewayClassName)
if c.controller.HasGatewayClass(gatewayClassName) {
// TODO: handle listeners
listeners, err := c.controller.translator.TranslateGatewayV1beta1(gateway)
if err != nil {
return err
}
err = c.controller.AddListeners(gateway.Namespace, gateway.Name, listeners)
if err != nil {
return err
}
} else {
gatewayClass, err := c.controller.gatewayClassLister.Get(gatewayClassName)
if err != nil {
return err
}
if gatewayClass.Spec.ControllerName == GatewayClassName {
log.Warn("gatewayClass not synced")
return fmt.Errorf("wait gatewayClass %s synced", gatewayClassName)
}
}
}
// TODO The current implementation does not fully support the definition of Gateway.
// We can update `spec.addresses` with the current data plane information.
// At present, we choose to directly update `GatewayStatus.Addresses`
// to indicate that we have picked the Gateway resource.
c.recordStatus(gateway, string(gatewayv1beta1.ListenerReasonReady), metav1.ConditionTrue, gateway.Generation)
return nil
}