diff --git a/.github/workflows/build-pull.yaml b/.github/workflows/build-pull.yaml index ad6d86d03..25b96f7b7 100644 --- a/.github/workflows/build-pull.yaml +++ b/.github/workflows/build-pull.yaml @@ -67,10 +67,3 @@ jobs: name: function-runtime-python312 dockerfile: python312/Dockerfile context: components/runtimes/python - - build-java17: - uses: kyma-project/test-infra/.github/workflows/image-builder.yml@main # Usage: kyma-project/test-infra/.github/workflows/image-builder.yml@main - with: - name: function-runtime-java17-jvm-alpha - dockerfile: Dockerfile-jvm-runtime - context: components/runtimes/java17 diff --git a/.github/workflows/build-push-release.yaml b/.github/workflows/build-push-release.yaml index 748f1a2b6..5787eb793 100644 --- a/.github/workflows/build-push-release.yaml +++ b/.github/workflows/build-push-release.yaml @@ -98,12 +98,3 @@ jobs: dockerfile: python312/Dockerfile context: components/runtimes/python tags: ${{ needs.compute-tags.outputs.tags }} - - build-java17: - needs: compute-tags - uses: kyma-project/test-infra/.github/workflows/image-builder.yml@main # Usage: kyma-project/test-infra/.github/workflows/image-builder.yml@main - with: - name: function-runtime-java17-jvm-alpha - dockerfile: Dockerfile-jvm-runtime - context: components/runtimes/java17 - tags: ${{ needs.compute-tags.outputs.tags }} diff --git a/components/runtimes/java17/.gitignore b/components/runtimes/java17/.gitignore deleted file mode 100644 index 816f32965..000000000 --- a/components/runtimes/java17/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -target -.idea -opentelemetry-javaagent.jar \ No newline at end of file diff --git a/components/runtimes/java17/Dockerfile-jvm-function-local b/components/runtimes/java17/Dockerfile-jvm-function-local deleted file mode 100644 index 84db71c2e..000000000 --- a/components/runtimes/java17/Dockerfile-jvm-function-local +++ /dev/null @@ -1,21 +0,0 @@ -FROM java-runtime:17 as builder - -ARG BUILD_DIR=/build -#When kaniko build the image it has Handler.java and pom.xml in the /src, but When I work on function locally the pom.xml can be in /src, but Handler.java lies in the package deep in src. -ARG SOURCE_DIR=/src -ARG DEPS_DIR=/src -WORKDIR $BUILD_DIR - -COPY $DEPS_DIR/pom.xml $BUILD_DIR/handler-pom.xml - -COPY $SOURCE_DIR/Handler.java $BUILD_DIR/src/main/java/io/project/kyma/serverless/handler/Handler.java -RUN mvn dependency:go-offline -f handler-pom.xml - -RUN mvn clean && mvn package -f pom.xml - -FROM eclipse-temurin:17-jre-alpine - -COPY --from=builder /build/target/kyma-java-runtime-0.0.1.jar /app.jar - -ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar -USER 1000 diff --git a/components/runtimes/java17/Dockerfile-jvm-function.tpl b/components/runtimes/java17/Dockerfile-jvm-function.tpl deleted file mode 100644 index 8af11bf1d..000000000 --- a/components/runtimes/java17/Dockerfile-jvm-function.tpl +++ /dev/null @@ -1,21 +0,0 @@ -FROM ${BASE_IMAGE} as builder - -ARG BUILD_DIR=/build -#When kaniko build the image it has Handler.java and pom.xml in the /src, but When I work on function locally the pom.xml can be in /src, but Handler.java lies in the package deep in src. -ARG SOURCE_DIR=/src -ARG DEPS_DIR=/src -WORKDIR $BUILD_DIR - -COPY $DEPS_DIR/pom.xml $BUILD_DIR/handler-pom.xml - -COPY $SOURCE_DIR/Handler.java $BUILD_DIR/src/main/java/io/project/kyma/serverless/handler/Handler.java -RUN mvn dependency:go-offline -f handler-pom.xml - -RUN mvn clean && mvn package -f pom.xml - -FROM eclipse-temurin:17-jre-alpine - -COPY --from=builder /build/target/kyma-java-runtime-0.0.1.jar /app.jar - -ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar -USER 1000 diff --git a/components/runtimes/java17/Dockerfile-jvm-runtime b/components/runtimes/java17/Dockerfile-jvm-runtime deleted file mode 100644 index 3d258c9a1..000000000 --- a/components/runtimes/java17/Dockerfile-jvm-runtime +++ /dev/null @@ -1,13 +0,0 @@ -FROM maven:3.8-openjdk-17-slim -WORKDIR /build - -#Compile and install SDK locally -COPY serverless-java-sdk serverless-java-sdk -RUN (cd serverless-java-sdk && mvn clean package install) - -COPY ./pom.xml . -RUN mvn dependency:go-offline - -# Create runtime -COPY ./src ./src -RUN mvn compile diff --git a/components/runtimes/java17/Makefile b/components/runtimes/java17/Makefile deleted file mode 100644 index acad10c49..000000000 --- a/components/runtimes/java17/Makefile +++ /dev/null @@ -1,69 +0,0 @@ -#This is address of registry visible from k3s cluster. -#On linux you can get this address by executing `hostname -I` - -#TODO: /etc/hosts and coredns patch, fetch it as optional -#REGISTRY_ADR=k3d-kyma-registry.localhost:5000 -REGISTRY_ADR=192.168.122.1:5000 -JVM_VERSION=17 -RUNTIME_IMAGE=java-runtime:${JVM_VERSION} -RUNTIME_IMAGE_REMOTE=${REGISTRY_ADR}/${RUNTIME_IMAGE} - -install-sdk: - (cd serverless-java-sdk && mvn install) - -.PHONY: clean -clean: - mvn clean package - -#------------------------------------------------------JVM-------------------------------------------------------------# -.PHONY: build-runtime -build-runtime: install-sdk - docker build -t ${RUNTIME_IMAGE} -f Dockerfile-jvm-runtime . - -.PHONY: push-runtime-k3d -push-runtime-k3d: - docker image tag ${RUNTIME_IMAGE} ${RUNTIME_IMAGE_REMOTE} - docker push ${RUNTIME_IMAGE_REMOTE} - -#------------------------------------------------------K8s-Resources---------------------------------------------------# -#Generate configmaps which can be used to move to serverless resources - -IMAGE_HELM_TPL='{{ include "imageurl" (dict "reg" .Values.global.containerRegistry "img" .Values.global.images.function_runtime_java${JVM_VERSION}_jvm_alpha) }}' -.PHONY: generate-configmaps -generate-configmaps: - DOCKERFILE=Dockerfile-jvm-function.tpl BASE_IMAGE=${IMAGE_HELM_TPL} python3 ./resources/generate-dockerfile.py | \ - CONFIGMAP=resources/java${JVM_VERSION}-jvm-alpha.yaml RUNTIME=java${JVM_VERSION}-jvm-alpha python3 resources/generate-cm.py > ./resources/java${JVM_VERSION}-jvm-alpha.yaml - -generate-configmaps-local-image: - DOCKERFILE=Dockerfile-jvm-function.tpl BASE_IMAGE=${RUNTIME_IMAGE_REMOTE} python3 ./resources/generate-dockerfile.py | \ - CONFIGMAP=resources/java${JVM_VERSION}-jvm-alpha.yaml RUNTIME=java${JVM_VERSION}-jvm-alpha python3 resources/generate-cm.py > ./resources/java${JVM_VERSION}-jvm-alpha-local.yaml - - -apply-java-runtime: - kubectl replace -f ./resources/java17-jvm-alpha.yaml - -apply-java-runtime-local: - kubectl replace -f ./resources/java17-jvm-alpha-local.yaml - -#-------------------------------------------------Run Example function locally-----------------------------------------# -#Example function -#Create Dockerfile to use with example hello-world -export BASE_IMAGE = ${RUNTIME_IMAGE} - -FUNCTION_IMAGE=java-jvm${JVM_VERSION}-function - -.PHONY: generate-local-fn-dockerfile -generate-local-fn-dockerfile: - DOCKERFILE=Dockerfile-jvm-function.tpl BASE_IMAGE=${RUNTIME_IMAGE} python3 ./resources/generate-dockerfile.py > Dockerfile-jvm-function-local - -run-jvm-hello-world: build-runtime generate-local-fn-dockerfile - docker build --tag ${FUNCTION_IMAGE} \ - --build-arg DEPS_DIR=./examples/hello-world/ \ - --build-arg SOURCE_DIR=./examples/hello-world/src/main/java/io/project/kyma/serverless/handler \ - -f Dockerfile-jvm-function-local . - - docker run -ti -p 8080:8080 --rm --env PUBLISHER_PROXY_ADDRESS=http://localhost:10000/publish \ - --env TRACE_COLLECTOR_ENDPOINT=http://localhost:4318/v1/traces \ - --env SERVICE_NAMESPACE=default \ - --env HOSTNAME=emitter-local-84dd76fc94-2pnpd \ - --name java-jvm-function ${FUNCTION_IMAGE} diff --git a/components/runtimes/java17/examples/hello-world/.Dockerignore b/components/runtimes/java17/examples/hello-world/.Dockerignore deleted file mode 100644 index 4c3f8757e..000000000 --- a/components/runtimes/java17/examples/hello-world/.Dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -.project -.settings -.classpath -target/ diff --git a/components/runtimes/java17/examples/hello-world/.gitignore b/components/runtimes/java17/examples/hello-world/.gitignore deleted file mode 100644 index 4c3f8757e..000000000 --- a/components/runtimes/java17/examples/hello-world/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.project -.settings -.classpath -target/ diff --git a/components/runtimes/java17/examples/hello-world/pom.xml b/components/runtimes/java17/examples/hello-world/pom.xml deleted file mode 100644 index b64faf860..000000000 --- a/components/runtimes/java17/examples/hello-world/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - 4.0.0 - io.project.kyma.serverless - java-function - 0.0.1 - jar - - hello-world - - - UTF-8 - 11 - 11 - - - - - jakarta.ws.rs - jakarta.ws.rs-api - 3.1.0 - provided - - - io.project.kyma.serverless - serverless-java-sdk - 0.0.1 - compile - - - diff --git a/components/runtimes/java17/examples/hello-world/src/main/java/io/project/kyma/serverless/handler/Handler.java b/components/runtimes/java17/examples/hello-world/src/main/java/io/project/kyma/serverless/handler/Handler.java deleted file mode 100644 index 993dc2217..000000000 --- a/components/runtimes/java17/examples/hello-world/src/main/java/io/project/kyma/serverless/handler/Handler.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.project.kyma.serverless.handler; - -import jakarta.ws.rs.core.Context; -import jakarta.ws.rs.core.Response; - -import io.project.kyma.serverless.sdk.CloudEvent; -import io.project.kyma.serverless.sdk.Function; - - -public class Handler implements Function { - - public static final String RETURN_STRING = "Hello World from java17 runtime with serverless SDK!"; - - @Override - public Response main(CloudEvent event, Context context) { - return Response.ok(RETURN_STRING).build(); - } -} diff --git a/components/runtimes/java17/pom.xml b/components/runtimes/java17/pom.xml deleted file mode 100644 index 9f831c875..000000000 --- a/components/runtimes/java17/pom.xml +++ /dev/null @@ -1,145 +0,0 @@ - - - 4.0.0 - - io.project.kyma.serverless - kyma-java-runtime - 0.0.1 - jar - - - 11 - 11 - - - - - - io.opentelemetry - opentelemetry-bom - 1.20.0 - pom - import - - - org.junit - junit-bom - 5.9.1 - pom - import - - - - - - - - org.eclipse.jetty - jetty-server - 11.0.13 - - - org.eclipse.jetty - jetty-servlet - 11.0.13 - - - org.glassfish.jersey.containers - jersey-container-servlet-core - 3.1.0 - - - org.glassfish.jersey.media - jersey-media-json-jackson - 3.1.0 - - - org.glassfish.jersey.inject - jersey-hk2 - 3.1.0 - - - javax.xml.bind - jaxb-api - 2.1 - - - org.codehaus.jackson - jackson-core-asl - 1.9.13 - - - io.project.kyma.serverless - serverless-java-sdk - 0.0.1 - compile - - - io.opentelemetry - opentelemetry-api - - - io.opentelemetry - opentelemetry-sdk - - - io.opentelemetry - opentelemetry-exporter-otlp - - - io.opentelemetry - opentelemetry-extension-trace-propagators - - - io.opentelemetry - opentelemetry-semconv - 1.20.0-alpha - - - org.junit.jupiter - junit-jupiter - test - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - ${java.source.level} - ${java.target.level} - UTF-8 - true - true - - - - maven-assembly-plugin - - - - io.project.kyma.serverless.Main - - - - jar-with-dependencies - - false - - - - package - - single - - - - - - - diff --git a/components/runtimes/java17/resources/.gitignore b/components/runtimes/java17/resources/.gitignore deleted file mode 100644 index ee3c36cb2..000000000 --- a/components/runtimes/java17/resources/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -java17-jvm-alpha.yaml -java17-jvm-alpha-local.yaml \ No newline at end of file diff --git a/components/runtimes/java17/resources/cm.yaml.tpl b/components/runtimes/java17/resources/cm.yaml.tpl deleted file mode 100644 index 8aba3632e..000000000 --- a/components/runtimes/java17/resources/cm.yaml.tpl +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: dockerfile-${RUNTIME_NAME} - namespace: kyma-system - labels: - serverless.kyma-project.io/config: runtime - serverless.kyma-project.io/runtime: ${RUNTIME_NAME} -data: - Dockerfile: |- -${DOCKERFILE} diff --git a/components/runtimes/java17/resources/generate-cm.py b/components/runtimes/java17/resources/generate-cm.py deleted file mode 100644 index e33c6647c..000000000 --- a/components/runtimes/java17/resources/generate-cm.py +++ /dev/null @@ -1,25 +0,0 @@ -import os -import sys - - -indentation = " " - -def append_indentation(content): - content_builder = "" - for line in content.split("\n"): - content_builder += (indentation + line+ "\n") - return content_builder - -runtime = os.environ['RUNTIME'] - -dockerfile_content="" -for line in sys.stdin: - dockerfile_content+=line - -dockerfile_content= append_indentation(dockerfile_content) - -cm_content="" -with open("resources/cm.yaml.tpl") as cm_tpl_file: - cm_tpl = cm_tpl_file.read() - cm_content = cm_tpl.replace("${DOCKERFILE}", dockerfile_content).replace("${RUNTIME_NAME}",runtime) -print(cm_content,end="") diff --git a/components/runtimes/java17/resources/generate-dockerfile.py b/components/runtimes/java17/resources/generate-dockerfile.py deleted file mode 100644 index bb24f699f..000000000 --- a/components/runtimes/java17/resources/generate-dockerfile.py +++ /dev/null @@ -1,11 +0,0 @@ -import os - - -dockerfile_file = os.environ['DOCKERFILE'] -base_image = os.environ['BASE_IMAGE'] -dockerfile_content = "" -with open(dockerfile_file) as dockerfile: - dockerfile_content = dockerfile.read() - dockerfile_content = dockerfile_content.replace("${BASE_IMAGE}", base_image) - -print(dockerfile_content, end="") diff --git a/components/runtimes/java17/serverless-java-sdk/Makefile b/components/runtimes/java17/serverless-java-sdk/Makefile deleted file mode 100644 index 53a41883f..000000000 --- a/components/runtimes/java17/serverless-java-sdk/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -.default=install - -.PHONY: install -install: - mvn clean package install \ No newline at end of file diff --git a/components/runtimes/java17/serverless-java-sdk/pom.xml b/components/runtimes/java17/serverless-java-sdk/pom.xml deleted file mode 100644 index c6b191a38..000000000 --- a/components/runtimes/java17/serverless-java-sdk/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - 4.0.0 - - io.project.kyma.serverless - serverless-java-sdk - 0.0.1 - jar - - - 11 - 11 - - - - - jakarta.ws.rs - jakarta.ws.rs-api - 3.1.0 - provided - - - org.glassfish.jersey.core - jersey-client - 3.1.0 - - - com.fasterxml.jackson.core - jackson-databind - 2.14.0 - - - io.opentelemetry - opentelemetry-api - 1.20.0 - - - \ No newline at end of file diff --git a/components/runtimes/java17/serverless-java-sdk/src/main/java/io/project/kyma/serverless/sdk/CloudEvent.java b/components/runtimes/java17/serverless-java-sdk/src/main/java/io/project/kyma/serverless/sdk/CloudEvent.java deleted file mode 100644 index 0e7287894..000000000 --- a/components/runtimes/java17/serverless-java-sdk/src/main/java/io/project/kyma/serverless/sdk/CloudEvent.java +++ /dev/null @@ -1,150 +0,0 @@ -package io.project.kyma.serverless.sdk; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectWriter; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.api.trace.Tracer; -import io.opentelemetry.context.propagation.TextMapSetter; -import jakarta.ws.rs.client.Client; -import jakarta.ws.rs.client.ClientBuilder; -import jakarta.ws.rs.client.Entity; -import jakarta.ws.rs.client.Invocation; -import jakarta.ws.rs.container.ContainerRequestContext; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.MultivaluedHashMap; -import jakarta.ws.rs.core.MultivaluedMap; -import jakarta.ws.rs.core.Response; -import org.glassfish.jersey.client.ClientConfig; -import org.glassfish.jersey.logging.LoggingFeature; - -import java.io.IOException; -import java.net.URI; -import java.util.Arrays; -import java.util.logging.Level; -import java.util.logging.Logger; - -public class CloudEvent { - - private static final CloudEventHeaders[] CLOUD_EVENT_HEADERS = {CloudEventHeaders.CE_TYPE, - CloudEventHeaders.CE_SOURCE, - CloudEventHeaders.CE_EVENT_TYPE_VERSION, - CloudEventHeaders.CE_SPEC_VERSION, - CloudEventHeaders.CE_ID, - CloudEventHeaders.CE_TIME,}; - - private enum CloudEventHeaders { - CE_TYPE("ce-type"), CE_SOURCE("ce-source"), CE_EVENT_TYPE_VERSION("ce-eventtypeversion"), - CE_SPEC_VERSION("ce-specversion"), CE_TIME("ce-time"), CE_ID("ce-id"); - - private final String headerName; - - public String getHeader() { - return this.headerName; - } - - CloudEventHeaders(String name) { - this.headerName = name; - } - } - - public ContainerRequestContext req; - public final MultivaluedMap ceHeaders; - - public Tracer tracer; - - private final URI publishedProxyAddress; - - private final OpenTelemetry openTelemetry; - - public CloudEvent(ContainerRequestContext req, OpenTelemetry openTelemetry, Tracer tracer, URI publisherAddr) { - this.req = req; - this.tracer = tracer; - this.ceHeaders = extractCloudEventHeaders(req.getHeaders()); - this.openTelemetry = openTelemetry; - this.publishedProxyAddress = publisherAddr; - } - - - public ResponseCloudEvent buildResponseCloudEvent(String id, String type, String data) { - var ceResponse = new ResponseCloudEvent(); - ceResponse.type = type; - ceResponse.source = getHeaderValue(ceHeaders, CloudEventHeaders.CE_SOURCE); - ceResponse.eventTypeVersion = getHeaderValue(ceHeaders, CloudEventHeaders.CE_EVENT_TYPE_VERSION); - ceResponse.specVersion = getHeaderValue(ceHeaders, CloudEventHeaders.CE_SPEC_VERSION); - ceResponse.id = id; - ceResponse.data = data; - ceResponse.dataContentType = resolveDataType(data); - return ceResponse; - } - - public void publishCloudEvent(ResponseCloudEvent ceEvent) throws IOException, InterruptedException { - ObjectWriter ow = new ObjectMapper().writer(); - var outBody = ow.writeValueAsBytes(ceEvent.data); - - ClientConfig config = new ClientConfig(); - config.register(new LoggingFeature(Logger.getLogger(LoggingFeature.DEFAULT_LOGGER_NAME), Level.INFO, LoggingFeature.Verbosity.PAYLOAD_ANY, 10000)); - - Client client = ClientBuilder.newClient(config); - - Invocation.Builder reqBuilder = client.target(this.publishedProxyAddress).request(). - header("Content-Type", "application/json"). - header(CloudEventHeaders.CE_SPEC_VERSION.getHeader(), ceEvent.specVersion). - header(CloudEventHeaders.CE_TYPE.getHeader(), ceEvent.type). - header(CloudEventHeaders.CE_SOURCE.getHeader(), ceEvent.source). - header(CloudEventHeaders.CE_EVENT_TYPE_VERSION.getHeader(), ceEvent.eventTypeVersion). - header(CloudEventHeaders.CE_ID.getHeader(), ceEvent.id); - - injectHeaderSetter(reqBuilder); - var res = reqBuilder.post(Entity.json(ceEvent.data)); - if (Response.Status.Family.familyOf(res.getStatus()) != Response.Status.Family.SUCCESSFUL) { - throw new IOException("Failed to send event. The publisher responded with:" + res.getStatus() + "status code which is not in 2xx successful family"); - } - } - - public Invocation.Builder getTraceableRequestBuilder(String target) { - Client client = ClientBuilder.newClient(); - Invocation.Builder reqBuilder = client.target(target).request(); - injectHeaderSetter(reqBuilder); - return reqBuilder; - } - - private void injectHeaderSetter(Invocation.Builder reqBuilder) { - - TextMapSetter setter = (carrier, key, value) -> { - // Insert the context as Header - System.out.println("Inject->" + key + ":" + value); - assert carrier != null; - carrier.header(key, value); - }; - openTelemetry.getPropagators().getTextMapPropagator().inject(io.opentelemetry.context.Context.current(), reqBuilder, setter); - } - - private static MultivaluedMap extractCloudEventHeaders(MultivaluedMap headers) { - MultivaluedMap ceHeaders = new MultivaluedHashMap<>(); - Arrays.stream(CLOUD_EVENT_HEADERS).forEach(ceHeader -> ceHeaders.add(ceHeader.getHeader(), getHeaderValue(headers, ceHeader))); - return ceHeaders; - } - - private static String getHeaderValue(MultivaluedMap headers, CloudEventHeaders ceHeader) { - String headerValue = ""; - var headerValues = headers.get(ceHeader.getHeader()); - if (headerValues != null && headerValues.size() > 0) { - headerValue = headerValues.get(0); - } - return headerValue; - } - - - private static MediaType resolveDataType(String data) { - try { - final ObjectMapper mapper = new ObjectMapper(); - mapper.readTree(data); - return MediaType.APPLICATION_JSON_TYPE; - - } catch (IOException ignored) { - - } - return MediaType.TEXT_PLAIN_TYPE; - } - -} diff --git a/components/runtimes/java17/serverless-java-sdk/src/main/java/io/project/kyma/serverless/sdk/Function.java b/components/runtimes/java17/serverless-java-sdk/src/main/java/io/project/kyma/serverless/sdk/Function.java deleted file mode 100644 index 228f404b8..000000000 --- a/components/runtimes/java17/serverless-java-sdk/src/main/java/io/project/kyma/serverless/sdk/Function.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.project.kyma.serverless.sdk; - -import jakarta.ws.rs.core.Context; -import jakarta.ws.rs.core.Response; - - -public interface Function { - Response main(CloudEvent event, Context context); -} diff --git a/components/runtimes/java17/serverless-java-sdk/src/main/java/io/project/kyma/serverless/sdk/ResponseCloudEvent.java b/components/runtimes/java17/serverless-java-sdk/src/main/java/io/project/kyma/serverless/sdk/ResponseCloudEvent.java deleted file mode 100644 index a8ca69de9..000000000 --- a/components/runtimes/java17/serverless-java-sdk/src/main/java/io/project/kyma/serverless/sdk/ResponseCloudEvent.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.project.kyma.serverless.sdk; -import jakarta.ws.rs.core.MediaType; - -public class ResponseCloudEvent { - public String type; - public String source; - public String eventTypeVersion; - public String specVersion; - public String id; - public String data; - public MediaType dataContentType; - -} diff --git a/components/runtimes/java17/src/main/java/io/project/kyma/serverless/Config.java b/components/runtimes/java17/src/main/java/io/project/kyma/serverless/Config.java deleted file mode 100644 index 7795a8df4..000000000 --- a/components/runtimes/java17/src/main/java/io/project/kyma/serverless/Config.java +++ /dev/null @@ -1,43 +0,0 @@ -package io.project.kyma.serverless; - -import java.net.URI; -import java.net.URISyntaxException; - -public class Config { - - private static final int DEFAULT_PORT = 8080; - protected final URI publisherProxyAddr; - protected final URI tracingCollectorAddr; - protected int port; - protected final String podName; - protected final String serviceNamespace; - - protected Config() throws IllegalArgumentException { - this.publisherProxyAddr = getURIFromEnv("PUBLISHER_PROXY_ADDRESS"); - this.tracingCollectorAddr = getURIFromEnv("TRACE_COLLECTOR_ENDPOINT"); - this.podName = System.getenv("HOSTNAME"); - this.serviceNamespace = System.getenv("SERVICE_NAMESPACE"); - this.port = getNumber("FUNCTION_PORT"); - } - - private int getNumber(String envName) { - int serverPort = DEFAULT_PORT; - String fnPort = System.getenv(envName); - if (fnPort != null && fnPort.equals("")) { - serverPort = Integer.parseInt(fnPort); - } - return serverPort; - } - - private URI getURIFromEnv(String envName) throws IllegalArgumentException { - String envValue = System.getenv(envName); - if (envValue == null) { - throw new IllegalArgumentException("Couldn't find env:" + envName); - } - try { - return new URI(envValue); - } catch (URISyntaxException e) { - throw new IllegalArgumentException("Couldn't parse env:" + envName + "with value:" + envValue, e); - } - } -} diff --git a/components/runtimes/java17/src/main/java/io/project/kyma/serverless/JerseyServer.java b/components/runtimes/java17/src/main/java/io/project/kyma/serverless/JerseyServer.java deleted file mode 100644 index f4f932770..000000000 --- a/components/runtimes/java17/src/main/java/io/project/kyma/serverless/JerseyServer.java +++ /dev/null @@ -1,114 +0,0 @@ -package io.project.kyma.serverless; - -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.api.internal.StringUtils; -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.context.propagation.TextMapGetter; -import io.project.kyma.serverless.handler.Handler; -import io.project.kyma.serverless.sdk.CloudEvent; -import io.project.kyma.serverless.sdk.Function; - -import jakarta.ws.rs.*; -import jakarta.ws.rs.container.ContainerRequestContext; -import jakarta.ws.rs.core.Context; -import jakarta.ws.rs.core.MultivaluedMap; -import jakarta.ws.rs.core.Response; -import java.net.URI; -import java.util.logging.Logger; - -@Path("/") -public class JerseyServer { - - - private final Function fn; - - private static final Logger logger = Logger.getGlobal(); - - private final URI publisherProxyAddr; - - private final OpenTelemetry openTelemetry; - private final String svcName; - - public JerseyServer(OpenTelemetry openTelemetry, URI publisherProxyAddr, String svcName) { - this.publisherProxyAddr = publisherProxyAddr; - this.svcName = svcName; - this.openTelemetry = openTelemetry; - this.fn = new Handler(); - } - - @GET - @Path("/healthz") - public Response healthz(@Context ContainerRequestContext request) { - return Response.ok("ok").build(); - } - - @GET - public Response home(@Context ContainerRequestContext request) { - return callUserFunction(request); - } - - @POST - public Response homePost(@Context ContainerRequestContext request) { - return callUserFunction(request); - } - - @PUT - public Response homePut(@Context ContainerRequestContext request) { - return callUserFunction(request); - } - - @DELETE - public Response homeDelete(@Context ContainerRequestContext request) { - return callUserFunction(request); - } - - - private Response callUserFunction(ContainerRequestContext httpRequest) { - var tracer = openTelemetry.getTracerProvider().get(svcName); - var extractedContext = injectPropagatorGetter(httpRequest); - extractedContext.makeCurrent(); - Span span = null; - try { - span = tracer.spanBuilder("request").setSpanKind(SpanKind.SERVER).startSpan(); - span.makeCurrent(); - - var ceEvent = new CloudEvent(httpRequest, openTelemetry, tracer, this.publisherProxyAddr); - return this.fn.main(ceEvent, null); - } finally { - if (span != null) { - span.end(); - } - } - } - - private io.opentelemetry.context.Context injectPropagatorGetter(ContainerRequestContext httpRequest) { - TextMapGetter getter = new TextMapGetter<>() { - @Override - public Iterable keys(ContainerRequestContext requestContext) { - return requestContext.getHeaders().keySet(); - } - - @Override - public String get(ContainerRequestContext requestContext, String key) { - String value = getHeaderValue(requestContext.getHeaders(), key); - if (StringUtils.isNullOrEmpty(value)) { - return null; - } - return value; - } - }; - return GlobalOpenTelemetry.get().getPropagators().getTextMapPropagator().extract(io.opentelemetry.context.Context.current(), httpRequest, getter); - } - - private static String getHeaderValue(MultivaluedMap headers, String key) { - String headerValue = ""; - var headerValues = headers.get(key); - if (headerValues != null && headerValues.size() > 0) { - headerValue = headerValues.get(0); - } - return headerValue; - } -} - diff --git a/components/runtimes/java17/src/main/java/io/project/kyma/serverless/Main.java b/components/runtimes/java17/src/main/java/io/project/kyma/serverless/Main.java deleted file mode 100644 index b46f36776..000000000 --- a/components/runtimes/java17/src/main/java/io/project/kyma/serverless/Main.java +++ /dev/null @@ -1,82 +0,0 @@ -package io.project.kyma.serverless; - -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.context.propagation.ContextPropagators; -import io.opentelemetry.context.propagation.TextMapPropagator; -import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter; -import io.opentelemetry.extension.trace.propagation.B3Propagator; -import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.resources.Resource; -import io.opentelemetry.sdk.trace.SdkTracerProvider; -import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; -import io.opentelemetry.semconv.resource.attributes.ResourceAttributes; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.glassfish.jersey.server.ResourceConfig; -import org.glassfish.jersey.servlet.ServletContainer; - -import java.net.URI; -import java.util.Arrays; -import java.util.stream.Collectors; - -public class Main { - - public Main(Config config) throws Exception { - String svcName = createSvcName(config.podName, config.serviceNamespace); - - var openTelemetry = configureTracing(config.tracingCollectorAddr, svcName); - Server server = configureServer(config.port, openTelemetry, svcName, config.publisherProxyAddr); - server.start(); - server.join(); - } - - private Server configureServer(int serverPort, OpenTelemetry openTelemetry, String svcName, URI publisherProxyAddr) { - ResourceConfig resourceConfig = new ResourceConfig(); - - JerseyServer jerseyServer = new JerseyServer(openTelemetry, publisherProxyAddr, svcName); - resourceConfig.registerInstances(jerseyServer); - - ServletContainer servletContainer = new ServletContainer(resourceConfig); - ServletHolder sh = new ServletHolder(servletContainer); - - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); - context.addServlet(sh, "/*"); - - Server server = new Server(serverPort); - server.setHandler(context); - return server; - } - - static String createSvcName(String podName, String svcNamespace) { - if ((podName == null) || (svcNamespace == null)) { - return "generic-svc"; - } - // remove generated pods suffix ( two last sections ) - // TODO: createSvcName based on func name, not pod name - var svcNameBuilder = Arrays.stream(podName.split("-")).limit(2). - collect(Collectors.joining("-")); - return String.join(".", svcNameBuilder, svcNamespace); - } - - private OpenTelemetry configureTracing(URI tracingEndpoint, String svcName) { - Resource resource = Resource.getDefault() - .merge(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, svcName))); - - SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder() - .addSpanProcessor(SimpleSpanProcessor.create(OtlpHttpSpanExporter.builder().setEndpoint(tracingEndpoint.toString()).build())) - .setResource(resource) - .build(); - TextMapPropagator b3Propagator = B3Propagator.injectingMultiHeaders(); - var sdk = OpenTelemetrySdk.builder().setPropagators(ContextPropagators.create(b3Propagator)). - setTracerProvider(sdkTracerProvider). - buildAndRegisterGlobal(); - return sdk; - } - - public static void main(String[] args) throws Exception { - Config config = new Config(); - new Main(config); - } -} diff --git a/components/runtimes/java17/src/main/java/io/project/kyma/serverless/handler/Handler.java b/components/runtimes/java17/src/main/java/io/project/kyma/serverless/handler/Handler.java deleted file mode 100644 index 6a9453038..000000000 --- a/components/runtimes/java17/src/main/java/io/project/kyma/serverless/handler/Handler.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.project.kyma.serverless.handler; - -import jakarta.ws.rs.core.Context; -import jakarta.ws.rs.core.Response; - -import io.project.kyma.serverless.sdk.CloudEvent; -import io.project.kyma.serverless.sdk.Function; - - -public class Handler implements Function { - - @Override - public Response main(CloudEvent event, Context context) { - throw new IllegalStateException("Not implemented stub Handler"); - } -} diff --git a/components/runtimes/java17/src/main/test/io/project/kyma/serverless/MainTest.java b/components/runtimes/java17/src/main/test/io/project/kyma/serverless/MainTest.java deleted file mode 100644 index 5bede5318..000000000 --- a/components/runtimes/java17/src/main/test/io/project/kyma/serverless/MainTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.project.kyma.serverless; - -import static org.junit.jupiter.api.Assertions.*; - -class MainTest { - - @org.junit.jupiter.api.Test - void createSvcName_Success() { - //GIVEN - String svcName = "default"; - String podName = "emitter-qqmds-84dd76fc94-2pnpd"; - String expected = "emitter-qqmds.default"; - //WHEN - String output = Main.createSvcName(podName, svcName); - //THEN - assertEquals(expected, output); - } -} \ No newline at end of file