func()

in pkg/deploy/lattice/listener_manager.go [46:95]


func (d *defaultListenerManager) Upsert(
	ctx context.Context,
	modelListener *model.Listener,
	modelSvc *model.Service,
) (model.ListenerStatus, error) {
	if modelSvc.Status == nil || modelSvc.Status.Id == "" {
		return model.ListenerStatus{}, errors.New("model service is missing id")
	}

	d.log.Infof(ctx, "Upsert listener %s-%s", modelListener.Spec.K8SRouteName, modelListener.Spec.K8SRouteNamespace)
	latticeSvcId := modelSvc.Status.Id
	latticeListenerSummary, err := d.findListenerByPort(ctx, latticeSvcId, modelListener.Spec.Port)

	if err != nil {
		return model.ListenerStatus{}, err
	}

	defaultAction, err := d.getLatticeListenerDefaultAction(ctx, modelListener)
	if err != nil {
		return model.ListenerStatus{}, err
	}

	if latticeListenerSummary == nil {
		// listener not found, create new one
		return d.create(ctx, latticeSvcId, modelListener, defaultAction)
	}

	existingListenerStatus := model.ListenerStatus{
		Name:        aws.StringValue(latticeListenerSummary.Name),
		ListenerArn: aws.StringValue(latticeListenerSummary.Arn),
		Id:          aws.StringValue(latticeListenerSummary.Id),
		ServiceId:   latticeSvcId,
	}
	if modelListener.Spec.Protocol != vpclattice.ListenerProtocolTlsPassthrough {
		// The only mutable field for lattice listener is defaultAction, for non-TLS_PASSTHROUGH listener, the defaultAction is always the FixedResponse 404. Don't need to update.
		return existingListenerStatus, nil
	}

	// For TLS_PASSTHROUGH listener, check whether it needs to update defaultAction
	needToUpdateDefaultAction, err := d.needToUpdateDefaultAction(ctx, latticeSvcId, *latticeListenerSummary.Id, defaultAction)
	if err != nil {
		return model.ListenerStatus{}, err
	}
	if needToUpdateDefaultAction {
		if err = d.update(ctx, latticeSvcId, latticeListenerSummary, defaultAction); err != nil {
			return model.ListenerStatus{}, err
		}
	}
	return existingListenerStatus, nil
}