This is an automated email from the ASF dual-hosted git repository. nferraro pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit a828d3b2b62032dd4fb83e48234c4133c4369dab Author: nicolaferraro <ni.ferr...@gmail.com> AuthorDate: Thu Aug 6 11:00:54 2020 +0200 Fix #1548: avoid looking up knative destination when full information is provided --- e2e/yaks/knative-sinkbinding/source.yaml | 2 +- pkg/trait/knative.go | 62 ++++++++++++++++++++++---------- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/e2e/yaks/knative-sinkbinding/source.yaml b/e2e/yaks/knative-sinkbinding/source.yaml index e54dd96..3e5179b 100644 --- a/e2e/yaks/knative-sinkbinding/source.yaml +++ b/e2e/yaks/knative-sinkbinding/source.yaml @@ -25,4 +25,4 @@ - transform: simple: "${body.toUpperCase()}" - to: "log:info" - - to: "knative:channel/messages" + - to: "knative:channel/messages?apiVersion=messaging.knative.dev/v1beta1&kind=InMemoryChannel" diff --git a/pkg/trait/knative.go b/pkg/trait/knative.go index d735146..3f4fbf8 100644 --- a/pkg/trait/knative.go +++ b/pkg/trait/knative.go @@ -251,7 +251,11 @@ func (t *knativeTrait) Apply(e *Environment) error { func (t *knativeTrait) configureChannels(e *Environment, env *knativeapi.CamelEnvironment) error { // Sources err := t.ifServiceMissingDo(e, env, t.ChannelSources, knativeapi.CamelServiceTypeChannel, knativeapi.CamelEndpointKindSource, - func(ref *corev1.ObjectReference, loc *url.URL, serviceURI string) error { + func(ref *corev1.ObjectReference, serviceURI string, urlProvider func() (*url.URL, error)) error { + loc, err := urlProvider() + if err != nil { + return err + } meta := map[string]string{ knativeapi.CamelMetaServicePath: "/", knativeapi.CamelMetaEndpointKind: string(knativeapi.CamelEndpointKindSource), @@ -282,7 +286,11 @@ func (t *knativeTrait) configureChannels(e *Environment, env *knativeapi.CamelEn if t.SinkBinding == nil || !*t.SinkBinding { // Sinks err = t.ifServiceMissingDo(e, env, t.ChannelSinks, knativeapi.CamelServiceTypeChannel, knativeapi.CamelEndpointKindSink, - func(ref *corev1.ObjectReference, loc *url.URL, serviceURI string) error { + func(ref *corev1.ObjectReference, serviceURI string, urlProvider func() (*url.URL, error)) error { + loc, err := urlProvider() + if err != nil { + return err + } svc, err := knativeapi.BuildCamelServiceDefinition(ref.Name, knativeapi.CamelEndpointKindSink, knativeapi.CamelServiceTypeChannel, *loc, ref.APIVersion, ref.Kind) if err != nil { @@ -334,7 +342,11 @@ func (t *knativeTrait) configureEndpoints(e *Environment, env *knativeapi.CamelE // Sinks if t.SinkBinding == nil || !*t.SinkBinding { err := t.ifServiceMissingDo(e, env, t.EndpointSinks, knativeapi.CamelServiceTypeEndpoint, knativeapi.CamelEndpointKindSink, - func(ref *corev1.ObjectReference, loc *url.URL, serviceURI string) error { + func(ref *corev1.ObjectReference, serviceURI string, urlProvider func() (*url.URL, error)) error { + loc, err := urlProvider() + if err != nil { + return err + } svc, err := knativeapi.BuildCamelServiceDefinition(ref.Name, knativeapi.CamelEndpointKindSink, knativeapi.CamelServiceTypeEndpoint, *loc, ref.APIVersion, ref.Kind) if err != nil { @@ -354,7 +366,7 @@ func (t *knativeTrait) configureEndpoints(e *Environment, env *knativeapi.CamelE func (t *knativeTrait) configureEvents(e *Environment, env *knativeapi.CamelEnvironment) error { // Sources err := t.withServiceDo(false, e, env, t.EventSources, knativeapi.CamelServiceTypeEvent, knativeapi.CamelEndpointKindSource, - func(ref *corev1.ObjectReference, loc *url.URL, serviceURI string) error { + func(ref *corev1.ObjectReference, serviceURI string, _ func() (*url.URL, error)) error { // Iterate over all, without skipping duplicates eventType := knativeutil.ExtractEventType(serviceURI) t.createTrigger(e, ref, eventType) @@ -383,7 +395,11 @@ func (t *knativeTrait) configureEvents(e *Environment, env *knativeapi.CamelEnvi // Sinks if t.SinkBinding == nil || !*t.SinkBinding { err = t.ifServiceMissingDo(e, env, t.EventSinks, knativeapi.CamelServiceTypeEvent, knativeapi.CamelEndpointKindSink, - func(ref *corev1.ObjectReference, loc *url.URL, serviceURI string) error { + func(ref *corev1.ObjectReference, serviceURI string, urlProvider func() (*url.URL, error)) error { + loc, err := urlProvider() + if err != nil { + return err + } svc, err := knativeapi.BuildCamelServiceDefinition(ref.Name, knativeapi.CamelEndpointKindSink, knativeapi.CamelServiceTypeEvent, *loc, ref.APIVersion, ref.Kind) if err != nil { @@ -422,7 +438,7 @@ func (t *knativeTrait) configureSinkBinding(e *Environment, env *knativeapi.Came return fmt.Errorf("sinkbinding can only be used with a single sink: found %d sinks", len(services)) } - err := t.withServiceDo(false, e, env, services, serviceType, knativeapi.CamelEndpointKindSink, func(ref *corev1.ObjectReference, url *url.URL, serviceURI string) error { + err := t.withServiceDo(false, e, env, services, serviceType, knativeapi.CamelEndpointKindSink, func(ref *corev1.ObjectReference, serviceURI string, _ func() (*url.URL, error)) error { e.ApplicationProperties["camel.k.customizer.sinkbinding.enabled"] = "true" e.ApplicationProperties["camel.k.customizer.sinkbinding.name"] = ref.Name e.ApplicationProperties["camel.k.customizer.sinkbinding.type"] = string(serviceType) @@ -491,7 +507,7 @@ func (t *knativeTrait) ifServiceMissingDo( serviceURIs []string, serviceType knativeapi.CamelServiceType, endpointKind knativeapi.CamelEndpointKind, - gen func(ref *corev1.ObjectReference, url *url.URL, serviceURI string) error) error { + gen func(ref *corev1.ObjectReference, serviceURI string, urlProvider func() (*url.URL, error)) error) error { return t.withServiceDo(true, e, env, serviceURIs, serviceType, endpointKind, gen) } @@ -502,7 +518,7 @@ func (t *knativeTrait) withServiceDo( serviceURIs []string, serviceType knativeapi.CamelServiceType, endpointKind knativeapi.CamelEndpointKind, - gen func(ref *corev1.ObjectReference, url *url.URL, serviceURI string) error) error { + gen func(ref *corev1.ObjectReference, serviceURI string, urlProvider func() (*url.URL, error)) error) error { for _, serviceURI := range t.extractServices(serviceURIs, serviceType) { ref, err := knativeutil.ExtractObjectReference(serviceURI) @@ -513,18 +529,28 @@ func (t *knativeTrait) withServiceDo( continue } possibleRefs := knativeutil.FillMissingReferenceData(serviceType, ref) - actualRef, err := knativeutil.GetAddressableReference(t.Ctx, t.Client, possibleRefs, e.Integration.Namespace, ref.Name) - if err != nil && k8serrors.IsNotFound(err) { - return errors.Errorf("cannot find %s", serviceType.ResourceDescription(ref.Name)) - } else if err != nil { - return errors.Wrapf(err, "error looking up %s", serviceType.ResourceDescription(ref.Name)) + var actualRef *corev1.ObjectReference + if len(possibleRefs) == 1 { + actualRef = &possibleRefs[0] + } else { + actualRef, err = knativeutil.GetAddressableReference(t.Ctx, t.Client, possibleRefs, e.Integration.Namespace, ref.Name) + if err != nil && k8serrors.IsNotFound(err) { + return errors.Errorf("cannot find %s", serviceType.ResourceDescription(ref.Name)) + } else if err != nil { + return errors.Wrapf(err, "error looking up %s", serviceType.ResourceDescription(ref.Name)) + } } - targetURL, err := knativeutil.GetSinkURL(t.Ctx, t.Client, actualRef, e.Integration.Namespace) - if err != nil { - return errors.Wrapf(err, "cannot determine address of %s", serviceType.ResourceDescription(ref.Name)) + + urlProvider := func() (*url.URL, error) { + targetURL, err := knativeutil.GetSinkURL(t.Ctx, t.Client, actualRef, e.Integration.Namespace) + if err != nil { + return nil, errors.Wrapf(err, "cannot determine address of %s", serviceType.ResourceDescription(ref.Name)) + } + t.L.Infof("Found URL for %s: %s", serviceType.ResourceDescription(ref.Name), targetURL.String()) + return targetURL, nil } - t.L.Infof("Found URL for %s: %s", serviceType.ResourceDescription(ref.Name), targetURL.String()) - err = gen(actualRef, targetURL, serviceURI) + + err = gen(actualRef, serviceURI, urlProvider) if err != nil { return errors.Wrapf(err, "unexpected error while executing handler for %s", serviceType.ResourceDescription(ref.Name)) }