This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-kamelets.git
commit c64f31b0f6ebb7667aca034a7d67954356cde5ff Author: Christoph Deppisch <cdeppi...@redhat.com> AuthorDate: Wed Nov 30 13:02:55 2022 +0100 Improve CloudEvents output produced by AWS S3 source - Align with CloudEvents spec in creating proper event type and source values - Enable Knative YAKS tests --- .github/actions/install-knative/action.yml | 26 ++++ .github/actions/install-knative/install-knative.sh | 142 +++++++++++++++++++++ .github/workflows/yaks-tests.yaml | 7 +- .../aws2/s3/AWS2S3CloudEventOutputType.java | 4 +- .../aws2/s3/AWS2S3CloudEventOutputTypeTest.java | 4 +- test/aws-s3/aws-s3-cloudevents.feature | 8 +- test/aws-s3/aws-s3-knative-binding.feature | 16 ++- test/aws-s3/aws-s3-knative.feature | 5 + test/aws-s3/yaks-config.yaml | 2 +- test/utils/knative-channel-to-log.yaml | 34 +++++ 10 files changed, 230 insertions(+), 18 deletions(-) diff --git a/.github/actions/install-knative/action.yml b/.github/actions/install-knative/action.yml new file mode 100644 index 00000000..24dd36f9 --- /dev/null +++ b/.github/actions/install-knative/action.yml @@ -0,0 +1,26 @@ +# --------------------------------------------------------------------------- +# 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. +# --------------------------------------------------------------------------- + +name: install-knative +description: 'Install Knative serving and eventing' +runs: + using: "composite" + steps: + - name: Install Knative + shell: bash + run: | + ./.github/actions/install-knative/install-knative.sh diff --git a/.github/actions/install-knative/install-knative.sh b/.github/actions/install-knative/install-knative.sh new file mode 100755 index 00000000..8434afc9 --- /dev/null +++ b/.github/actions/install-knative/install-knative.sh @@ -0,0 +1,142 @@ +#!/bin/bash + +# --------------------------------------------------------------------------- +# 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. +# --------------------------------------------------------------------------- + +#### +# +# Install the knative setup +# +#### + +set -e + +# Prerequisites +sudo wget https://github.com/mikefarah/yq/releases/download/v4.26.1/yq_linux_amd64 -O /usr/bin/yq && sudo chmod +x /usr/bin/yq + +set +e + +export SERVING_VERSION=knative-v1.6.0 +export EVENTING_VERSION=knative-v1.6.0 +export KOURIER_VERSION=knative-v1.6.0 + +apply() { + local file="${1:-}" + if [ -z "${file}" ]; then + echo "Error: Cannot apply. No file." + exit 1 + fi + + kubectl apply --filename ${file} + if [ $? != 0 ]; then + sleep 5 + echo "Re-applying ${file} ..." + kubectl apply --filename ${file} + if [ $? != 0 ]; then + echo "Error: Application of resource failed." + exit 1 + fi + fi +} + +SERVING_CRDS="https://github.com/knative/serving/releases/download/${SERVING_VERSION}/serving-crds.yaml" +SERVING_CORE="https://github.com/knative/serving/releases/download/${SERVING_VERSION}/serving-core.yaml" +KOURIER="https://github.com/knative-sandbox/net-kourier/releases/download/${KOURIER_VERSION}/kourier.yaml" +EVENTING_CRDS="https://github.com/knative/eventing/releases/download/${EVENTING_VERSION}/eventing-crds.yaml" +EVENTING_CORE="https://github.com/knative/eventing/releases/download/${EVENTING_VERSION}/eventing-core.yaml" +IN_MEMORY_CHANNEL="https://github.com/knative/eventing/releases/download/${EVENTING_VERSION}/in-memory-channel.yaml" +CHANNEL_BROKER="https://github.com/knative/eventing/releases/download/${EVENTING_VERSION}/mt-channel-broker.yaml" + +# Serving +apply "${SERVING_CRDS}" + +YAML=$(mktemp serving-core-XXX.yaml) +curl -L -s ${SERVING_CORE} | head -n -1 | yq e 'del(.spec.template.spec.containers[].resources)' - > ${YAML} +if [ -s ${YAML} ]; then + apply ${YAML} + echo "Waiting for pods to be ready in knative-serving (dependency for kourier)" + kubectl wait --for=condition=Ready pod --all -n knative-serving --timeout=60s +else + echo "Error: Failed to correctly download ${SERVING_CORE}" + exit 1 +fi + +# Kourier +apply "${KOURIER}" + +sleep 5 + +kubectl patch configmap/config-network \ + --namespace knative-serving \ + --type merge \ + --patch '{"data":{"ingress.class":"kourier.ingress.networking.knative.dev"}}' +if [ $? != 0 ]; then + echo "Error: Failed to patch configmap" + exit 1 +fi + +# Eventing +apply "${EVENTING_CRDS}" + +YAML=$(mktemp eventing-XXX.yaml) +curl -L -s ${EVENTING_CORE} | head -n -1 | yq e 'del(.spec.template.spec.containers[].resources)' - > ${YAML} +if [ -s ${YAML} ]; then + apply ${YAML} +else + echo "Error: Failed to correctly download ${SERVING_CORE}" + exit 1 +fi + +# Eventing channels +YAML=$(mktemp in-memory-XXX.yaml) +curl -L -s ${IN_MEMORY_CHANNEL} | head -n -1 | yq e 'del(.spec.template.spec.containers[].resources)' - > ${YAML} +if [ -s ${YAML} ]; then + apply ${YAML} +else + echo "Error: Failed to correctly download ${SERVING_CORE}" + exit 1 +fi + +# Eventing broker +YAML=$(mktemp channel-broker-XXX.yaml) +curl -L -s ${CHANNEL_BROKER} | head -n -1 | yq e 'del(.spec.template.spec.containers[].resources)' - > ${YAML} +if [ -s ${YAML} ]; then + apply ${YAML} +else + echo "Error: Failed to correctly download ${SERVING_CORE}" + exit 1 +fi + +# Eventing sugar controller configuration +echo "Patching Knative eventing configuration" +kubectl patch configmap/config-sugar \ + -n knative-eventing \ + --type merge \ + -p '{"data":{"namespace-selector":"{\"matchExpressions\":[{\"key\":\"eventing.knative.dev/injection\",\"operator\":\"In\",\"values\":[\"enabled\"]}]}"}}' + +kubectl patch configmap/config-sugar \ + -n knative-eventing \ + --type merge \ + -p '{"data":{"trigger-selector":"{\"matchExpressions\":[{\"key\":\"eventing.knative.dev/injection\",\"operator\":\"In\",\"values\":[\"enabled\"]}]}"}}' + +# Wait for installation completed +echo "Waiting for all pods to be ready in kourier-system" +kubectl wait --for=condition=Ready pod --all -n kourier-system --timeout=60s +echo "Waiting for all pods to be ready in knative-serving" +kubectl wait --for=condition=Ready pod --all -n knative-serving --timeout=60s +echo "Waiting for all pods to be ready in knative-eventing" +kubectl wait --for=condition=Ready pod --all -n knative-eventing --timeout=60s diff --git a/.github/workflows/yaks-tests.yaml b/.github/workflows/yaks-tests.yaml index 4acd7c8a..73dcec77 100644 --- a/.github/workflows/yaks-tests.yaml +++ b/.github/workflows/yaks-tests.yaml @@ -91,6 +91,8 @@ jobs: kubectl version kubectl cluster-info kubectl describe nodes + - name: Install Knative + uses: ./.github/actions/install-knative - name: Install Camel K run: | # Configure install options @@ -110,10 +112,7 @@ jobs: echo "Running tests" yaks run test/aws-ddb-sink $YAKS_RUN_OPTIONS - yaks run test/aws-s3/aws-s3-uri-binding.feature $YAKS_RUN_OPTIONS - yaks run test/aws-s3/aws-s3-source-property-conf.feature $YAKS_RUN_OPTIONS - yaks run test/aws-s3/aws-s3-source-secret-conf.feature $YAKS_RUN_OPTIONS - yaks run test/aws-s3/aws-s3-source-uri-conf.feature $YAKS_RUN_OPTIONS + yaks run test/aws-s3 $YAKS_RUN_OPTIONS yaks run test/extract-field-action $YAKS_RUN_OPTIONS yaks run test/insert-field-action $YAKS_RUN_OPTIONS diff --git a/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/format/converter/aws2/s3/AWS2S3CloudEventOutputType.java b/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/format/converter/aws2/s3/AWS2S3CloudEventOutputType.java index d1906f24..4bc87192 100644 --- a/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/format/converter/aws2/s3/AWS2S3CloudEventOutputType.java +++ b/library/camel-kamelets-utils/src/main/java/org/apache/camel/kamelets/utils/format/converter/aws2/s3/AWS2S3CloudEventOutputType.java @@ -44,8 +44,8 @@ public class AWS2S3CloudEventOutputType implements DataTypeConverter { public void convert(Exchange exchange) { final Map<String, Object> headers = exchange.getMessage().getHeaders(); - headers.put(CAMEL_CLOUD_EVENT_TYPE, "kamelet.aws.s3.source"); - headers.put(CAMEL_CLOUD_EVENT_SOURCE, exchange.getMessage().getHeader(AWS2S3Constants.BUCKET_NAME, String.class)); + headers.put(CAMEL_CLOUD_EVENT_TYPE, "org.apache.camel.event.aws.s3.getObject"); + headers.put(CAMEL_CLOUD_EVENT_SOURCE, "aws.s3.bucket." + exchange.getMessage().getHeader(AWS2S3Constants.BUCKET_NAME, String.class)); headers.put(CAMEL_CLOUD_EVENT_SUBJECT, exchange.getMessage().getHeader(AWS2S3Constants.KEY, String.class)); headers.put(CAMEL_CLOUD_EVENT_TIME, getEventTime(exchange)); } diff --git a/library/camel-kamelets-utils/src/test/java/org/apache/camel/kamelets/utils/format/converter/aws2/s3/AWS2S3CloudEventOutputTypeTest.java b/library/camel-kamelets-utils/src/test/java/org/apache/camel/kamelets/utils/format/converter/aws2/s3/AWS2S3CloudEventOutputTypeTest.java index f2d41606..084f4c16 100644 --- a/library/camel-kamelets-utils/src/test/java/org/apache/camel/kamelets/utils/format/converter/aws2/s3/AWS2S3CloudEventOutputTypeTest.java +++ b/library/camel-kamelets-utils/src/test/java/org/apache/camel/kamelets/utils/format/converter/aws2/s3/AWS2S3CloudEventOutputTypeTest.java @@ -52,9 +52,9 @@ class AWS2S3CloudEventOutputTypeTest { Assertions.assertTrue(exchange.getMessage().hasHeaders()); Assertions.assertTrue(exchange.getMessage().getHeaders().containsKey(AWS2S3Constants.KEY)); - assertEquals("kamelet.aws.s3.source", exchange.getMessage().getHeader(AWS2S3CloudEventOutputType.CAMEL_CLOUD_EVENT_TYPE)); + assertEquals("org.apache.camel.event.aws.s3.getObject", exchange.getMessage().getHeader(AWS2S3CloudEventOutputType.CAMEL_CLOUD_EVENT_TYPE)); assertEquals("test1.txt", exchange.getMessage().getHeader(AWS2S3CloudEventOutputType.CAMEL_CLOUD_EVENT_SUBJECT)); - assertEquals("myBucket", exchange.getMessage().getHeader(AWS2S3CloudEventOutputType.CAMEL_CLOUD_EVENT_SOURCE)); + assertEquals("aws.s3.bucket.myBucket", exchange.getMessage().getHeader(AWS2S3CloudEventOutputType.CAMEL_CLOUD_EVENT_SOURCE)); } @Test diff --git a/test/aws-s3/aws-s3-cloudevents.feature b/test/aws-s3/aws-s3-cloudevents.feature index 1e2f7d1e..52ac84c5 100644 --- a/test/aws-s3/aws-s3-cloudevents.feature +++ b/test/aws-s3/aws-s3-cloudevents.feature @@ -20,6 +20,10 @@ Feature: AWS S3 Kamelet - cloud events data type Given New global Camel context Given load to Camel registry amazonS3Client.groovy + Scenario: Create Knative broker + Given create Knative broker default + And Knative broker default is running + Scenario: Create AWS-S3 Kamelet to Knative binding Given variable loginfo is "Installed features" When load KameletBinding aws-s3-to-knative.yaml @@ -35,8 +39,8 @@ Feature: AWS S3 Kamelet - cloud events data type Given send Camel exchange to("aws2-s3://${aws.s3.bucketNameOrArn}?amazonS3Client=#amazonS3Client") with body: ${aws.s3.message} Then expect Knative event data: ${aws.s3.message} And verify Knative event - | type | kamelet.aws.s3.source | - | source | ${aws.s3.bucketNameOrArn} | + | type | org.apache.camel.event.aws.s3.getObject | + | source | aws.s3.bucket.${aws.s3.bucketNameOrArn} | | subject | ${aws.s3.key} | | id | @ignore@ | diff --git a/test/aws-s3/aws-s3-knative-binding.feature b/test/aws-s3/aws-s3-knative-binding.feature index c143bbee..e94ab715 100644 --- a/test/aws-s3/aws-s3-knative-binding.feature +++ b/test/aws-s3/aws-s3-knative-binding.feature @@ -17,31 +17,33 @@ Feature: AWS S3 Kamelet - binding to Knative Given New global Camel context Given load to Camel registry amazonS3Client.groovy - Scenario: Create Knative broker + Scenario: Create Knative broker and channel Given create Knative broker default And Knative broker default is running + And create Knative channel messages Scenario: Create AWS-S3 Kamelet to InMemoryChannel binding Given variable loginfo is "Installed features" Given load KameletBinding aws-s3-to-knative.yaml - Given load KameletBinding knative-to-log.yaml + Given load KameletBinding knative-channel-to-log.yaml Then KameletBinding aws-s3-to-knative should be available - And KameletBinding knative-to-log should be available + And KameletBinding knative-channel-to-log should be available And Camel K integration aws-s3-to-knative is running - And Camel K integration knative-to-log is running + And Camel K integration knative-channel-to-log is running And Camel K integration aws-s3-to-knative should print ${loginfo} - And Camel K integration knative-to-log should print ${loginfo} + And Camel K integration knative-channel-to-log should print ${loginfo} Then sleep 10000 ms Scenario: Verify Kamelet source Given Camel exchange message header CamelAwsS3Key="${aws.s3.key}" Given send Camel exchange to("aws2-s3://${aws.s3.bucketNameOrArn}?amazonS3Client=#amazonS3Client") with body: ${aws.s3.message} - Then Camel K integration knative-to-log should print ${aws.s3.message} + Then Camel K integration knative-channel-to-log should print ${aws.s3.message} Scenario: Remove resources Given delete KameletBinding aws-s3-to-knative - Given delete KameletBinding knative-to-log + Given delete KameletBinding knative-channel-to-log Given delete Knative broker default + Given delete Knative channel messages Scenario: Stop container Given stop LocalStack container diff --git a/test/aws-s3/aws-s3-knative.feature b/test/aws-s3/aws-s3-knative.feature index 148ec1d6..fe080fa2 100644 --- a/test/aws-s3/aws-s3-knative.feature +++ b/test/aws-s3/aws-s3-knative.feature @@ -20,6 +20,10 @@ Feature: AWS S3 Kamelet - Knative binding Given New global Camel context Given load to Camel registry amazonS3Client.groovy + Scenario: Create Knative broker + Given create Knative broker default + And Knative broker default is running + Scenario: Create AWS-S3 Kamelet to Knative binding Given variable loginfo is "Installed features" When load KameletBinding aws-s3-to-knative.yaml @@ -42,6 +46,7 @@ Feature: AWS S3 Kamelet - Knative binding Scenario: Remove Camel K resources Given delete KameletBinding aws-s3-to-knative Given delete Kubernetes service event-consumer-service + Given delete Knative broker default Scenario: Stop container Given stop LocalStack container diff --git a/test/aws-s3/yaks-config.yaml b/test/aws-s3/yaks-config.yaml index 0d70ba75..4ef910c4 100644 --- a/test/aws-s3/yaks-config.yaml +++ b/test/aws-s3/yaks-config.yaml @@ -43,7 +43,7 @@ config: - aws-s3-to-log-secret-based.groovy - aws-s3-uri-binding.yaml - aws-s3-to-knative.yaml - - ../utils/knative-to-log.yaml + - ../utils/knative-channel-to-log.yaml cucumber: tags: - "not @ignored" diff --git a/test/utils/knative-channel-to-log.yaml b/test/utils/knative-channel-to-log.yaml new file mode 100644 index 00000000..4fc551c6 --- /dev/null +++ b/test/utils/knative-channel-to-log.yaml @@ -0,0 +1,34 @@ +# --------------------------------------------------------------------------- +# 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. +# --------------------------------------------------------------------------- + +apiVersion: camel.apache.org/v1alpha1 +kind: KameletBinding +metadata: + name: knative-channel-to-log +spec: + source: + ref: + kind: InMemoryChannel + apiVersion: messaging.knative.dev/v1 + name: messages + sink: + ref: + kind: Kamelet + apiVersion: camel.apache.org/v1alpha1 + name: log-sink + properties: + showHeaders: true