This is an automated email from the ASF dual-hosted git repository. ptoth pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/spark-kubernetes-operator.git
The following commit(s) were added to refs/heads/main by this push: new 1ed8ce2 [SPARK-53026] Fix deserialize error for spec with DriverServiceIngressSpec field 1ed8ce2 is described below commit 1ed8ce27df1de189831b832203ef578f696ed697 Author: Qi Tan <16416018+tqj...@users.noreply.github.com> AuthorDate: Tue Aug 5 20:41:03 2025 +0200 [SPARK-53026] Fix deserialize error for spec with DriverServiceIngressSpec field ### What changes were proposed in this pull request? Add two annotations for DriverServiceIngressSpec constructor ### Why are the changes needed? Without the annotation, when applying the spec with DriverServiceIngressSpec, deserialization failed. ### Does this PR introduce _any_ user-facing change? no ### How was this patch tested? unit test ### Was this patch authored or co-authored using generative AI tooling? no Closes #292 from TQJADE/ingress-fix. Authored-by: Qi Tan <16416018+tqj...@users.noreply.github.com> Signed-off-by: Peter Toth <p_t...@apple.com> --- .../operator/spec/DriverServiceIngressSpec.java | 4 ++ .../k8s/operator/spec/ApplicationSpecTest.java | 23 +++++++++ .../spark-job-with-driver-service-ingress.json | 59 ++++++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/spark-operator-api/src/main/java/org/apache/spark/k8s/operator/spec/DriverServiceIngressSpec.java b/spark-operator-api/src/main/java/org/apache/spark/k8s/operator/spec/DriverServiceIngressSpec.java index 5ddccf1..e04f994 100644 --- a/spark-operator-api/src/main/java/org/apache/spark/k8s/operator/spec/DriverServiceIngressSpec.java +++ b/spark-operator-api/src/main/java/org/apache/spark/k8s/operator/spec/DriverServiceIngressSpec.java @@ -25,13 +25,17 @@ import io.fabric8.generator.annotation.Required; import io.fabric8.kubernetes.api.model.ObjectMeta; import io.fabric8.kubernetes.api.model.ServiceSpec; import io.fabric8.kubernetes.api.model.networking.v1.IngressSpec; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** Spec for a driver service ingress. */ @Data @Builder @JsonInclude(JsonInclude.Include.NON_NULL) +@NoArgsConstructor +@AllArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) public class DriverServiceIngressSpec { @Required protected ObjectMeta serviceMetadata; diff --git a/spark-operator-api/src/test/java/org/apache/spark/k8s/operator/spec/ApplicationSpecTest.java b/spark-operator-api/src/test/java/org/apache/spark/k8s/operator/spec/ApplicationSpecTest.java index 31693c9..59e6544 100644 --- a/spark-operator-api/src/test/java/org/apache/spark/k8s/operator/spec/ApplicationSpecTest.java +++ b/spark-operator-api/src/test/java/org/apache/spark/k8s/operator/spec/ApplicationSpecTest.java @@ -22,6 +22,10 @@ package org.apache.spark.k8s.operator.spec; import static org.apache.spark.k8s.operator.spec.DeploymentMode.ClusterMode; import static org.junit.jupiter.api.Assertions.*; +import java.io.IOException; +import java.io.InputStream; + +import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; class ApplicationSpecTest { @@ -46,4 +50,23 @@ class ApplicationSpecTest { assertEquals(0, tolerations.instanceConfig.minExecutors); assertEquals(0, tolerations.instanceConfig.maxExecutors); } + + @Test + void testSpecWithDriverServiceIngressList() throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + + InputStream inputStream = + getClass() + .getClassLoader() + .getResourceAsStream("spark-job-with-driver-service" + "-ingress.json"); + ApplicationSpec spec = objectMapper.readValue(inputStream, ApplicationSpec.class); + assertNotNull(spec.getDriverServiceIngressList()); + assertEquals(1, spec.getDriverServiceIngressList().size()); + + DriverServiceIngressSpec driverServiceIngress = spec.getDriverServiceIngressList().get(0); + assertNotNull(driverServiceIngress.getIngressMetadata()); + assertNotNull(driverServiceIngress.getIngressSpec()); + assertNotNull(driverServiceIngress.getServiceSpec()); + assertNotNull(driverServiceIngress.getServiceMetadata()); + } } diff --git a/spark-operator-api/src/test/resources/spark-job-with-driver-service-ingress.json b/spark-operator-api/src/test/resources/spark-job-with-driver-service-ingress.json new file mode 100644 index 0000000..1f44cbd --- /dev/null +++ b/spark-operator-api/src/test/resources/spark-job-with-driver-service-ingress.json @@ -0,0 +1,59 @@ +{ + "mainClass": "org.apache.spark.examples.SparkPi", + "jars": "local:///opt/spark/examples/jars/spark-examples.jar", + "sparkConf": { + "spark.kubernetes.driver.master": "local[10]", + "spark.kubernetes.driver.request.cores": "5", + "spark.kubernetes.driver.limit.cores": "5", + "spark.kubernetes.authenticate.driver.serviceAccountName": "spark", + "spark.kubernetes.container.image": "apache/spark:4.0.0" + }, + "runtimeVersions": { + "sparkVersion": "4.0.0" + }, + "driverServiceIngressList": [ + { + "serviceMetadata": { + "name": "spark-ui-service" + }, + "serviceSpec": { + "ports": [ + { + "protocol": "TCP", + "port": 80, + "targetPort": 4040 + } + ] + }, + "ingressMetadata": { + "name": "spark-ui-ingress", + "annotations": { + "nginx.ingress.kubernetes.io/rewrite-target": "/" + } + }, + "ingressSpec": { + "ingressClassName": "nginx-example", + "rules": [ + { + "http": { + "paths": [ + { + "path": "/", + "pathType": "Prefix", + "backend": { + "service": { + "name": "spark-ui-service", + "port": { + "number": 80 + } + } + } + } + ] + } + } + ] + } + } + ] +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org For additional commands, e-mail: commits-h...@spark.apache.org