This is an automated email from the ASF dual-hosted git repository.

claudio4j pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git


The following commit(s) were added to refs/heads/main by this push:
     new 18f7317b8 fix(service): Create normal service when knative-service 
trait is disabled
     new a82e464d3 Merge pull request #3871 from 
claudio4j/fix_knativeservice_main
18f7317b8 is described below

commit 18f7317b8d6c302fcbeed35ad2f9be1d2e0d5dac
Author: Claudio Miranda <clau...@claudius.com.br>
AuthorDate: Thu Dec 1 23:25:19 2022 -0300

    fix(service): Create normal service when knative-service trait is disabled
    
    https://github.com/apache/camel-k/issues/3849
    
    When knative-service and k8s service traits are enabled, the priority is
    to use knative-service in knative profile
---
 e2e/global/knative/files/http_out.groovy |  18 +++
 e2e/global/knative/knative_test.go       |  15 +++
 pkg/trait/service.go                     |  15 ++-
 pkg/trait/service_test.go                | 206 +++++++++++++++++++++++++++++++
 4 files changed, 248 insertions(+), 6 deletions(-)

diff --git a/e2e/global/knative/files/http_out.groovy 
b/e2e/global/knative/files/http_out.groovy
new file mode 100644
index 000000000..40f75a639
--- /dev/null
+++ b/e2e/global/knative/files/http_out.groovy
@@ -0,0 +1,18 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+from("rest:get:hello/")
+      .transform().simple("Hello");
\ No newline at end of file
diff --git a/e2e/global/knative/knative_test.go 
b/e2e/global/knative/knative_test.go
index fa9a9a2b4..a5931d687 100644
--- a/e2e/global/knative/knative_test.go
+++ b/e2e/global/knative/knative_test.go
@@ -107,6 +107,21 @@ func TestKnative(t *testing.T) {
 
                        Expect(Kamel("delete", "--all", "-n", 
ns).Execute()).To(Succeed())
                })
+
+               t.Run("Knative-service disabled", func(t *testing.T) {
+                       Expect(KamelRunWithID(operatorID, ns, 
"files/http_out.groovy", "-t", 
"knative-service.enabled=false").Execute()).To(Succeed())
+                       Eventually(IntegrationPodPhase(ns, "http-out"), 
TestTimeoutLong).Should(Equal(v1.PodRunning))
+                       Eventually(Service(ns, "http-out"), 
TestTimeoutShort).ShouldNot(BeNil())
+                       Consistently(KnativeService(ns, "http-out"), 
TestTimeoutShort).Should(BeNil())
+                       Expect(Kamel("delete", "--all", "-n", 
ns).Execute()).To(Succeed())
+               })
+
+               t.Run("Knative-service priority", func(t *testing.T) {
+                       Expect(KamelRunWithID(operatorID, ns, 
"files/http_out.groovy").Execute()).To(Succeed())
+                       Eventually(IntegrationPodPhase(ns, "http-out"), 
TestTimeoutLong).Should(Equal(v1.PodRunning))
+                       Eventually(KnativeService(ns, "http-out"), 
TestTimeoutShort).ShouldNot(BeNil())
+                       Expect(Kamel("delete", "--all", "-n", 
ns).Execute()).To(Succeed())
+               })
        })
 }
 
diff --git a/pkg/trait/service.go b/pkg/trait/service.go
index c707ce281..3f3410ed0 100644
--- a/pkg/trait/service.go
+++ b/pkg/trait/service.go
@@ -43,12 +43,6 @@ func newServiceTrait() Trait {
        }
 }
 
-// IsAllowedInProfile overrides default.
-func (t *serviceTrait) IsAllowedInProfile(profile v1.TraitProfile) bool {
-       return profile.Equal(v1.TraitProfileKubernetes) ||
-               profile.Equal(v1.TraitProfileOpenShift)
-}
-
 func (t *serviceTrait) Configure(e *Environment) (bool, error) {
        if e.Integration == nil || !pointer.BoolDeref(t.Enabled, true) {
                if e.Integration != nil {
@@ -63,6 +57,15 @@ func (t *serviceTrait) Configure(e *Environment) (bool, 
error) {
                return false, nil
        }
 
+       // in case the knative-service and service trait are enabled, the 
knative-service has priority
+       // then this service is disabled
+       if e.GetTrait(knativeServiceTraitID) != nil {
+               knativeServiceTrait, _ := 
e.GetTrait(knativeServiceTraitID).(*knativeServiceTrait)
+               if pointer.BoolDeref(knativeServiceTrait.Enabled, true) {
+                       return false, nil
+               }
+       }
+
        if !e.IntegrationInRunningPhases() {
                return false, nil
        }
diff --git a/pkg/trait/service_test.go b/pkg/trait/service_test.go
index 8b1cdfef0..ac2c59263 100644
--- a/pkg/trait/service_test.go
+++ b/pkg/trait/service_test.go
@@ -408,3 +408,209 @@ func TestServiceWithNodePort(t *testing.T) {
 
        assert.Equal(t, corev1.ServiceTypeNodePort, s.Spec.Type)
 }
+
+// When service and knative-service are enabled at the integration scope in 
knative profile
+// knative-service has the priority and the k8s service is not run.
+func TestServiceWithKnativeServiceEnabled(t *testing.T) {
+       catalog, err := camel.DefaultCatalog()
+       assert.Nil(t, err)
+
+       traitCatalog := NewCatalog(nil)
+
+       compressedRoute, err := 
gzip.CompressBase64([]byte(`from("netty-http:test").log("hello")`))
+       assert.NoError(t, err)
+
+       environment := Environment{
+               CamelCatalog: catalog,
+               Catalog:      traitCatalog,
+               Integration: &v1.Integration{
+                       ObjectMeta: metav1.ObjectMeta{
+                               Name:      ServiceTestName,
+                               Namespace: "ns",
+                       },
+                       Status: v1.IntegrationStatus{
+                               Phase: v1.IntegrationPhaseDeploying,
+                       },
+                       Spec: v1.IntegrationSpec{
+                               Profile: v1.TraitProfileKnative,
+                               Sources: []v1.SourceSpec{
+                                       {
+                                               DataSpec: v1.DataSpec{
+                                                       Name:        
"routes.js",
+                                                       Content:     
string(compressedRoute),
+                                                       Compression: true,
+                                               },
+                                               Language: v1.LanguageJavaScript,
+                                       },
+                               },
+                               Traits: v1.Traits{
+                                       Service: &traitv1.ServiceTrait{
+                                               Trait: traitv1.Trait{
+                                                       Enabled: 
pointer.Bool(true),
+                                               },
+                                               Auto: pointer.Bool(false),
+                                       },
+                                       KnativeService: 
&traitv1.KnativeServiceTrait{
+                                               Trait: traitv1.Trait{
+                                                       Enabled: 
pointer.Bool(true),
+                                               },
+                                       },
+                               },
+                       },
+               },
+               Platform: &v1.IntegrationPlatform{
+                       Spec: v1.IntegrationPlatformSpec{
+                               Cluster: v1.IntegrationPlatformClusterOpenShift,
+                               Build: v1.IntegrationPlatformBuildSpec{
+                                       PublishStrategy: 
v1.IntegrationPlatformBuildPublishStrategyS2I,
+                                       Registry:        
v1.RegistrySpec{Address: "registry"},
+                                       RuntimeVersion:  
catalog.Runtime.Version,
+                               },
+                       },
+                       Status: v1.IntegrationPlatformStatus{
+                               Phase: v1.IntegrationPlatformPhaseReady,
+                       },
+               },
+               EnvVars:        make([]corev1.EnvVar, 0),
+               ExecutedTraits: make([]Trait, 0),
+               Resources:      kubernetes.NewCollection(),
+       }
+       environment.Platform.ResyncStatusFullConfig()
+
+       err = traitCatalog.apply(&environment)
+
+       assert.Nil(t, err)
+       assert.NotEmpty(t, environment.ExecutedTraits)
+       assert.Nil(t, environment.GetTrait(serviceTraitID))
+       assert.NotNil(t, environment.GetTrait(knativeServiceTraitID))
+}
+
+func TestServicesWithKnativeProfile(t *testing.T) {
+       catalog, err := camel.DefaultCatalog()
+       assert.Nil(t, err)
+
+       traitCatalog := NewCatalog(nil)
+
+       compressedRoute, err := 
gzip.CompressBase64([]byte(`from("netty-http:test").log("hello")`))
+       assert.NoError(t, err)
+
+       environment := Environment{
+               CamelCatalog: catalog,
+               Catalog:      traitCatalog,
+               Integration: &v1.Integration{
+                       ObjectMeta: metav1.ObjectMeta{
+                               Name:      ServiceTestName,
+                               Namespace: "ns",
+                       },
+                       Status: v1.IntegrationStatus{
+                               Phase: v1.IntegrationPhaseDeploying,
+                       },
+                       Spec: v1.IntegrationSpec{
+                               Profile: v1.TraitProfileKnative,
+                               Sources: []v1.SourceSpec{
+                                       {
+                                               DataSpec: v1.DataSpec{
+                                                       Name:        
"routes.js",
+                                                       Content:     
string(compressedRoute),
+                                                       Compression: true,
+                                               },
+                                               Language: v1.LanguageJavaScript,
+                                       },
+                               },
+                       },
+               },
+               Platform: &v1.IntegrationPlatform{
+                       Spec: v1.IntegrationPlatformSpec{
+                               Cluster: v1.IntegrationPlatformClusterOpenShift,
+                               Build: v1.IntegrationPlatformBuildSpec{
+                                       PublishStrategy: 
v1.IntegrationPlatformBuildPublishStrategyS2I,
+                                       Registry:        
v1.RegistrySpec{Address: "registry"},
+                                       RuntimeVersion:  
catalog.Runtime.Version,
+                               },
+                       },
+                       Status: v1.IntegrationPlatformStatus{
+                               Phase: v1.IntegrationPlatformPhaseReady,
+                       },
+               },
+               EnvVars:        make([]corev1.EnvVar, 0),
+               ExecutedTraits: make([]Trait, 0),
+               Resources:      kubernetes.NewCollection(),
+       }
+       environment.Platform.ResyncStatusFullConfig()
+
+       err = traitCatalog.apply(&environment)
+
+       assert.Nil(t, err)
+       assert.NotEmpty(t, environment.ExecutedTraits)
+       assert.Nil(t, environment.GetTrait(serviceTraitID))
+       assert.NotNil(t, environment.GetTrait(knativeServiceTraitID))
+}
+
+// When the knative-service is disabled at the IntegrationPlatform, the k8s 
service is enabled.
+func TestServiceWithKnativeServiceDisabledInIntegrationPlatform(t *testing.T) {
+       catalog, err := camel.DefaultCatalog()
+       assert.Nil(t, err)
+
+       traitCatalog := NewCatalog(nil)
+
+       compressedRoute, err := 
gzip.CompressBase64([]byte(`from("netty-http:test").log("hello")`))
+       assert.NoError(t, err)
+
+       environment := Environment{
+               CamelCatalog: catalog,
+               Catalog:      traitCatalog,
+               Integration: &v1.Integration{
+                       ObjectMeta: metav1.ObjectMeta{
+                               Name:      ServiceTestName,
+                               Namespace: "ns",
+                       },
+                       Status: v1.IntegrationStatus{
+                               Phase: v1.IntegrationPhaseDeploying,
+                       },
+                       Spec: v1.IntegrationSpec{
+                               Profile: v1.TraitProfileKnative,
+                               Sources: []v1.SourceSpec{
+                                       {
+                                               DataSpec: v1.DataSpec{
+                                                       Name:        
"routes.js",
+                                                       Content:     
string(compressedRoute),
+                                                       Compression: true,
+                                               },
+                                               Language: v1.LanguageJavaScript,
+                                       },
+                               },
+                       },
+               },
+               Platform: &v1.IntegrationPlatform{
+                       Spec: v1.IntegrationPlatformSpec{
+                               Cluster: v1.IntegrationPlatformClusterOpenShift,
+                               Build: v1.IntegrationPlatformBuildSpec{
+                                       PublishStrategy: 
v1.IntegrationPlatformBuildPublishStrategyS2I,
+                                       Registry:        
v1.RegistrySpec{Address: "registry"},
+                                       RuntimeVersion:  
catalog.Runtime.Version,
+                               },
+                               Traits: v1.Traits{
+                                       KnativeService: 
&traitv1.KnativeServiceTrait{
+                                               Trait: traitv1.Trait{
+                                                       Enabled: 
pointer.Bool(false),
+                                               },
+                                       },
+                               },
+                       },
+                       Status: v1.IntegrationPlatformStatus{
+                               Phase: v1.IntegrationPlatformPhaseReady,
+                       },
+               },
+               EnvVars:        make([]corev1.EnvVar, 0),
+               ExecutedTraits: make([]Trait, 0),
+               Resources:      kubernetes.NewCollection(),
+       }
+       environment.Platform.ResyncStatusFullConfig()
+
+       err = traitCatalog.apply(&environment)
+
+       assert.Nil(t, err)
+       assert.NotEmpty(t, environment.ExecutedTraits)
+       assert.NotNil(t, environment.GetTrait(serviceTraitID))
+       assert.Nil(t, environment.GetTrait(knativeServiceTraitID))
+}

Reply via email to