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))
                }

Reply via email to