func()

in pkg/providers/gateway/translation/gateway_tlsroute.go [35:132]


func (t *translator) TranslateGatewayTLSRouteV1Alpha2(tlsRoute *gatewayv1alpha2.TLSRoute) (*translation.TranslateContext, error) {
	ctx := translation.DefaultEmptyTranslateContext()

	// TODO: Handle ParentRefs

	var hosts []string
	for _, hostname := range tlsRoute.Spec.Hostnames {
		// TODO: calculate intersection of listeners
		hosts = append(hosts, string(hostname))
	}

	rules := tlsRoute.Spec.Rules

	for i, rule := range rules {
		backends := rule.BackendRefs
		if len(backends) == 0 {
			continue
		}

		var ruleUpstreams []*apisixv1.Upstream

		for j, backend := range backends {
			//TODO: Support filters
			//filters := backend.Filters
			var kind string
			if backend.Kind == nil {
				kind = "service"
			} else {
				kind = strings.ToLower(string(*backend.Kind))
			}
			if kind != "service" {
				log.Warnw(fmt.Sprintf("ignore non-service kind at Rules[%v].BackendRefs[%v]", i, j),
					zap.String("kind", kind),
				)
				continue
			}

			var ns string
			if backend.Namespace == nil {
				ns = tlsRoute.Namespace
			} else {
				ns = string(*backend.Namespace)
			}
			//if ns != tlsRoute.Namespace {
			// TODO: check gatewayv1alpha2.ReferencePolicy
			//}

			if backend.Port == nil {
				log.Warnw(fmt.Sprintf("ignore nil port at Rules[%v].BackendRefs[%v]", i, j),
					zap.String("kind", kind),
				)
				continue
			}

			ups, err := t.KubeTranslator.TranslateService(ns, string(backend.Name), "", int32(*backend.Port))
			if err != nil {
				return nil, errors.Wrap(err, fmt.Sprintf("failed to translate Rules[%v].BackendRefs[%v]", i, j))
			}
			ups.Name = apisixv1.ComposeUpstreamName(ns, string(backend.Name), "", int32(*backend.Port), types.ResolveGranularity.Endpoint)

			ups.Labels["meta_namespace"] = utils.TruncateString(ns, 64)
			ups.Labels["meta_backend"] = utils.TruncateString(string(backend.Name), 64)
			ups.Labels["meta_port"] = fmt.Sprintf("%v", int32(*backend.Port))

			ups.ID = id.GenID(ups.Name)
			ctx.AddUpstream(ups)
			ruleUpstreams = append(ruleUpstreams, ups)
		}
		if len(ruleUpstreams) == 0 {
			log.Warnw(fmt.Sprintf("ignore all-failed backend refs at Rules[%v]", i),
				zap.Any("BackendRefs", rule.BackendRefs),
			)
			continue
		}

		for _, host := range hosts {
			route := apisixv1.NewDefaultStreamRoute()
			name := apisixv1.ComposeRouteName(tlsRoute.Namespace, tlsRoute.Name, fmt.Sprintf("%d-%s", i, host))
			route.ID = id.GenID(name)

			route.Labels["meta_namespace"] = utils.TruncateString(tlsRoute.Namespace, 64)
			route.Labels["meta_tlsroute"] = utils.TruncateString(tlsRoute.Name, 64)

			route.SNI = host

			route.UpstreamId = ruleUpstreams[0].ID
			if len(ruleUpstreams) > 1 {
				log.Warnw("ignore backends which is not the first one",
					zap.String("namespace", tlsRoute.Namespace),
					zap.String("tlsroute", tlsRoute.Name),
				)
			}
			ctx.AddStreamRoute(route)
		}
	}

	return ctx, nil
}