func()

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
}