func()

in pkg/gateway/model_build_targets.go [61:116]


func (b *LatticeTargetsModelBuilder) build(ctx context.Context,
	serviceExport *anv1alpha1.ServiceExport,
	service *corev1.Service, backendRef core.BackendRef,
	stack core.Stack, stackTgId string,
) (core.Stack, error) {
	isServiceExport := serviceExport != nil
	isBackendRef := service != nil && backendRef != nil
	if !(isServiceExport || isBackendRef) {
		return nil, errors.New("either service export or route/service/backendRef must be specified")
	}
	if isServiceExport && isBackendRef {
		return nil, errors.New("either service export or route/service/backendRef must be specified, but not both")
	}

	if isServiceExport {
		b.log.Debugf(ctx, "Processing targets for service export %s-%s", serviceExport.Name, serviceExport.Namespace)

		serviceName := types.NamespacedName{
			Namespace: serviceExport.Namespace,
			Name:      serviceExport.Name,
		}

		tmpSvc := &corev1.Service{}
		if err := b.client.Get(ctx, serviceName, tmpSvc); err != nil {
			return nil, err
		}
		service = tmpSvc
	} else {
		b.log.Debugf(ctx, "Processing targets for service %s-%s", service.Name, service.Namespace)
	}

	if stack == nil {
		stack = core.NewDefaultStack(core.StackID(k8s.NamespacedName(service)))
	}

	if !service.DeletionTimestamp.IsZero() {
		b.log.Debugf(ctx, "service %s/%s is deleted, skipping target build", service.Name, service.Namespace)
		return stack, nil
	}

	task := &latticeTargetsModelBuildTask{
		log:           b.log,
		client:        b.client,
		serviceExport: serviceExport,
		service:       service,
		backendRef:    backendRef,
		stack:         stack,
		stackTgId:     stackTgId,
	}

	if err := task.run(ctx); err != nil {
		return nil, err
	}

	return task.stack, nil
}