Skip to content

Commit

Permalink
fix (camel-k) : Deserializing Kamelet fails with UnrecognizedProperty…
Browse files Browse the repository at this point in the history
…Exception (fabric8io#3852)

Kamelet resource seems to be using JSONSchemaProps. However, this
JSONSchemaProps is not coming from Apiextensions. Camel repository seems
to have it's own version of JSONSchemaProps. It contains some additional
fields like `x-descriptors`. We've currently added a manual type mapping
of JSONSchemaProps to `io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaProps`
This works for most cases but doesn't work when some camel specific
fields are used in Kamelet (like in case of fabric8io#3852, fabric8io#3182).

Use CamelK's JSONSchemaProps instead of Apiextensions JSONSchemaProps.

Signed-off-by: Rohan Kumar <rohaan@redhat.com>
  • Loading branch information
rohanKanojia committed Apr 13, 2022
1 parent af21ba4 commit 0391d25
Show file tree
Hide file tree
Showing 6 changed files with 302 additions and 22 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#### Improvements
* Remove `setIntVal`, `setStrVal`, `setKind` setters from `IntOrString` class to avoid invalid combinations
* Fix #3852: Deserializing kamelets fails with UnrecognizedPropertyException
* Fix #3889 : remove piped stream for file download
* Fix #1285: removed references to manually calling registerCustomKind
* Fix #3334: adding basic support for server side apply. Use patch(PatchContext.of(PatchType.SERVER_SIDE_APPLY), service), or new PatchContext.Builder().withPatchType(PatchType.SERVER_SIDE_APPLY).withForce(true).build() to override conflicts.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ func main() {

// types that are manually defined in the model
providedTypes := []schemagen.ProvidedType{
{GoType: reflect.TypeOf(v1alpha1.JSONSchemaProps{}), JavaClass: "io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaProps"},
{GoType: reflect.TypeOf(v1.Flow{}), JavaClass: "com.fasterxml.jackson.databind.JsonNode"},
{GoType: reflect.TypeOf(v1.TraitConfiguration{}), JavaClass: "com.fasterxml.jackson.databind.JsonNode"},
}
Expand Down Expand Up @@ -81,6 +80,7 @@ func main() {
reflect.TypeOf(apis.VolatileTime{}): "java.lang.String",
reflect.TypeOf(runtime.RawExtension{}): "java.util.Map<String, Object>",
reflect.TypeOf(v1.Template{}): "java.util.Map<String, Object>",
reflect.TypeOf(v1alpha1.JSON{}): "com.fasterxml.jackson.databind.JsonNode",
}

json := schemagen.GenerateSchema("http://fabric8.io/camel-k/v1alpha1/CamelKSchema#", crdLists, providedPackages, manualTypeMap, packageMapping, mappingSchema, providedTypes, constraints, "io.fabric8")
Expand Down
3 changes: 0 additions & 3 deletions extensions/camel-k/model-v1alpha1/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,6 @@
<configuration>
<target>
<!-- removing the generated Schema class -->
<delete
file="${project.build.directory}/generated-sources/io/fabric8/camelk/v1alpha1/JSONSchemaProps.java"
verbose="true"/>
<delete
file="${project.build.directory}/generated-sources/io/fabric8/camelk/api/model/CamelKSchemaV1alpha1.java"
verbose="true"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,167 @@
"type": "string"
},
"schema": {
"existingJavaType": "io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaProps"
"$ref": "#/definitions/github_com_apache_camel-k_pkg_apis_camel_v1alpha1_JSONSchemaProps",
"existingJavaType": "io.fabric8.camelk.v1alpha1.JSONSchemaProps"
}
},
"javaType": "io.fabric8.camelk.v1alpha1.EventTypeSpec",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource"
]
},
"github_com_apache_camel-k_pkg_apis_camel_v1alpha1_ExternalDocumentation": {
"type": "object",
"properties": {
"description": {
"type": "string"
},
"url": {
"type": "string"
}
},
"javaType": "io.fabric8.camelk.v1alpha1.ExternalDocumentation",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource"
]
},
"github_com_apache_camel-k_pkg_apis_camel_v1alpha1_JSONSchemaProp": {
"type": "object",
"properties": {
"default": {
"existingJavaType": "com.fasterxml.jackson.databind.JsonNode"
},
"description": {
"type": "string"
},
"enum": {
"type": "array",
"javaOmitEmpty": true,
"items": {
"existingJavaType": "com.fasterxml.jackson.databind.JsonNode"
}
},
"example": {
"existingJavaType": "com.fasterxml.jackson.databind.JsonNode"
},
"exclusiveMaximum": {
"type": "boolean"
},
"exclusiveMinimum": {
"type": "boolean"
},
"format": {
"type": "string"
},
"id": {
"type": "string"
},
"maxItems": {
"type": "integer",
"existingJavaType": "Long"
},
"maxLength": {
"type": "integer",
"existingJavaType": "Long"
},
"maxProperties": {
"type": "integer",
"existingJavaType": "Long"
},
"maximum": {
"type": "string",
"existingJavaType": "String"
},
"minItems": {
"type": "integer",
"existingJavaType": "Long"
},
"minLength": {
"type": "integer",
"existingJavaType": "Long"
},
"minProperties": {
"type": "integer",
"existingJavaType": "Long"
},
"minimum": {
"type": "string",
"existingJavaType": "String"
},
"multipleOf": {
"type": "string",
"existingJavaType": "String"
},
"nullable": {
"type": "boolean"
},
"pattern": {
"type": "string"
},
"title": {
"type": "string"
},
"type": {
"type": "string"
},
"uniqueItems": {
"type": "boolean"
},
"x-descriptors": {
"type": "array",
"javaOmitEmpty": true,
"items": {
"type": "string"
}
}
},
"javaType": "io.fabric8.camelk.v1alpha1.JSONSchemaProp",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource"
]
},
"github_com_apache_camel-k_pkg_apis_camel_v1alpha1_JSONSchemaProps": {
"type": "object",
"properties": {
"$schema": {
"type": "string"
},
"description": {
"type": "string"
},
"example": {
"existingJavaType": "com.fasterxml.jackson.databind.JsonNode"
},
"externalDocs": {
"$ref": "#/definitions/github_com_apache_camel-k_pkg_apis_camel_v1alpha1_ExternalDocumentation",
"existingJavaType": "io.fabric8.camelk.v1alpha1.ExternalDocumentation"
},
"id": {
"type": "string"
},
"properties": {
"type": "object",
"existingJavaType": "java.util.Map\u003cString,io.fabric8.camelk.v1alpha1.JSONSchemaProp\u003e"
},
"required": {
"type": "array",
"javaOmitEmpty": true,
"items": {
"type": "string"
}
},
"title": {
"type": "string"
},
"type": {
"type": "string"
}
},
"javaType": "io.fabric8.camelk.v1alpha1.JSONSchemaProps",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource"
]
},
"github_com_apache_camel-k_pkg_apis_camel_v1alpha1_Kamelet": {
"type": "object",
"properties": {
Expand Down Expand Up @@ -324,7 +477,8 @@
"existingJavaType": "io.fabric8.camelk.v1alpha1.AuthorizationSpec"
},
"definition": {
"existingJavaType": "io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaProps"
"$ref": "#/definitions/github_com_apache_camel-k_pkg_apis_camel_v1alpha1_JSONSchemaProps",
"existingJavaType": "io.fabric8.camelk.v1alpha1.JSONSchemaProps"
},
"dependencies": {
"type": "array",
Expand Down Expand Up @@ -407,6 +561,18 @@
"$ref": "#/definitions/github_com_apache_camel-k_pkg_apis_camel_v1alpha1_EventTypeSpec",
"existingJavaType": "io.fabric8.camelk.v1alpha1.EventTypeSpec"
},
"github_com_apache_camel-k_pkg_apis_camel_v1alpha1_ExternalDocumentation": {
"$ref": "#/definitions/github_com_apache_camel-k_pkg_apis_camel_v1alpha1_ExternalDocumentation",
"existingJavaType": "io.fabric8.camelk.v1alpha1.ExternalDocumentation"
},
"github_com_apache_camel-k_pkg_apis_camel_v1alpha1_JSONSchemaProp": {
"$ref": "#/definitions/github_com_apache_camel-k_pkg_apis_camel_v1alpha1_JSONSchemaProp",
"existingJavaType": "io.fabric8.camelk.v1alpha1.JSONSchemaProp"
},
"github_com_apache_camel-k_pkg_apis_camel_v1alpha1_JSONSchemaProps": {
"$ref": "#/definitions/github_com_apache_camel-k_pkg_apis_camel_v1alpha1_JSONSchemaProps",
"existingJavaType": "io.fabric8.camelk.v1alpha1.JSONSchemaProps"
},
"github_com_apache_camel-k_pkg_apis_camel_v1alpha1_Kamelet": {
"$ref": "#/definitions/github_com_apache_camel-k_pkg_apis_camel_v1alpha1_Kamelet",
"existingJavaType": "io.fabric8.camelk.v1alpha1.Kamelet"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;

import io.fabric8.camelk.v1alpha1.JSONSchemaPropsBuilder;
import io.fabric8.camelk.v1alpha1.Kamelet;
import io.fabric8.camelk.v1alpha1.KameletBuilder;
import io.fabric8.kubernetes.api.model.apiextensions.v1.JSONSchemaPropsBuilder;
import org.junit.jupiter.api.Test;

import java.util.Collections;
import java.util.Scanner;

import static org.junit.jupiter.api.Assertions.assertEquals;
Expand All @@ -33,17 +33,17 @@
class KameletModelTest {

@Test
void shouldCreateKamelet() {
void shouldCreateKamelet() {
Kamelet kamelet = new KameletBuilder()
.withNewMetadata()
.withName("my-kamelet")
.endMetadata()
.withNewSpec()
.withDefinition(new JSONSchemaPropsBuilder()
// blah blah
.build())
.endSpec()
.build();
.withNewMetadata()
.withName("my-kamelet")
.endMetadata()
.withNewSpec()
.withDefinition(new JSONSchemaPropsBuilder()
// blah blah
.build())
.endSpec()
.build();

assertNotNull(kamelet);
assertEquals("my-kamelet", kamelet.getMetadata().getName());
Expand All @@ -54,8 +54,8 @@ void shouldDeserializeValidYamlIntoObject() throws JsonProcessingException {
final ObjectMapper mapper = new ObjectMapper();
// Given
String originalJson = new Scanner(getClass().getResourceAsStream("/valid-kamelet.json"))
.useDelimiter("\\A")
.next();
.useDelimiter("\\A")
.next();

// When
final Kamelet kamelet = mapper.readValue(originalJson, Kamelet.class);
Expand All @@ -72,5 +72,29 @@ void shouldDeserializeValidYamlIntoObject() throws JsonProcessingException {
assertTrue(kamelet.getSpec().getTemplate().containsKey("beans"));
assertTrue(kamelet.getSpec().getTemplate().containsKey("from"));
}
}

@Test
void shouldDeserializeValidYamlContainingCamelJSONSchemaProps() throws JsonProcessingException {
final ObjectMapper mapper = new ObjectMapper();
// Given
String originalJson = new Scanner(getClass().getResourceAsStream("/valid-kamelet-x-descriptors.json"))
.useDelimiter("\\A")
.next();

// When
final Kamelet kamelet = mapper.readValue(originalJson, Kamelet.class);
final String serializedJson = mapper.writeValueAsString(kamelet);
final Kamelet kameletFromSerializedJson = mapper.readValue(serializedJson, Kamelet.class);

// Then
assertNotNull(kamelet);
assertNotNull(serializedJson);
assertNotNull(kameletFromSerializedJson);
assertEquals(kamelet.getMetadata().getName(), kameletFromSerializedJson.getMetadata().getName());
assertNotNull(kamelet.getSpec().getDefinition());
assertNotNull(kamelet.getSpec().getDefinition().getProperties());
assertNotNull(kamelet.getSpec().getDefinition().getProperties().get("validate"));
assertEquals(Collections.singletonList("urn:alm:descriptor:com.tectonic.ui:checkbox"),
kamelet.getSpec().getDefinition().getProperties().get("validate").getxDescriptors());
}
}
Loading

0 comments on commit 0391d25

Please sign in to comment.