func()

in pkg/providers/gateway/gateway_tlsroute.go [99:201]


func (c *gatewayTLSRouteController) 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 TLSRoute resource with invalid key",
			zap.Error(err),
			zap.String("key", key),
		)
		return err
	}

	log.Debugw("sync TLSRoute", zap.String("key", key))

	tlsRoute, err := c.controller.gatewayTLSRouteLister.TLSRoutes(namespace).Get(name)
	if err != nil {
		if !k8serrors.IsNotFound(err) {
			log.Errorw("failed to get Gateway TLSRoute",
				zap.Error(err),
				zap.String("key", key),
			)
			return err
		}
		if ev.Type != types.EventDelete {
			log.Warnw("Gateway TLSRoute was deleted before process",
				zap.String("key", key),
			)
			// Don't need to retry.
			return nil
		}
	}

	if ev.Type == types.EventDelete {
		if tlsRoute != 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
		}
		tlsRoute = ev.Tombstone.(*gatewayv1alpha2.TLSRoute)
	}
	err = c.controller.validator.ValidateCommonRoute(tlsRoute)
	if err != nil {
		log.Errorw("failed to validate gateway HTTPRoute",
			zap.Error(err),
			zap.Any("object", tlsRoute),
		)
		return err
	}

	tctx, err := c.controller.translator.TranslateGatewayTLSRouteV1Alpha2(tlsRoute)
	if err != nil {
		log.Warnw("failed to translate gateway TLSRoute",
			zap.Error(err),
			zap.Any("object", tlsRoute),
		)
		return err
	}

	log.Debugw("translated TLSRoute",
		zap.Any("stream_routes", tctx.StreamRoutes),
		zap.Any("upstreams", tctx.Upstreams),
	)
	m := &utils.Manifest{
		StreamRoutes: tctx.StreamRoutes,
		Upstreams:    tctx.Upstreams,
	}

	var (
		added   *utils.Manifest
		updated *utils.Manifest
		deleted *utils.Manifest
	)

	if ev.Type == types.EventDelete {
		deleted = m
	} else if ev.Type == types.EventAdd {
		added = m
	} else {
		var oldCtx *translation.TranslateContext
		oldObj := ev.OldObject.(*gatewayv1alpha2.TLSRoute)
		oldCtx, err = c.controller.translator.TranslateGatewayTLSRouteV1Alpha2(oldObj)
		if err != nil {
			log.Errorw("failed to translate old TLSRoute",
				zap.String("version", oldObj.APIVersion),
				zap.String("event_type", "update"),
				zap.Any("TLSRoute", oldObj),
				zap.Error(err),
			)
			return err
		}

		om := &utils.Manifest{
			StreamRoutes: oldCtx.StreamRoutes,
			Upstreams:    oldCtx.Upstreams,
		}
		added, updated, deleted = m.Diff(om)
	}

	return utils.SyncManifests(ctx, c.controller.APISIX, c.controller.APISIXClusterName, added, updated, deleted, false)
}