From dac2670a2bcc1fbe8dbf8eef58fbc19b9608db34 Mon Sep 17 00:00:00 2001 From: Cameron Fieber Date: Mon, 20 May 2019 12:50:43 -0700 Subject: [PATCH] fix(bake/rosco): fix regression in snake casing of rosco specific bake properties (#2926) --- .../orca/bakery/api/BakeRequest.groovy | 9 ++++- .../bakery/config/BakeryConfiguration.groovy | 18 +++++---- .../orca/bakery/api/BakeRequestSpec.groovy | 37 +++++++++++++++++++ 3 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 orca-bakery/src/test/groovy/com/netflix/spinnaker/orca/bakery/api/BakeRequestSpec.groovy diff --git a/orca-bakery/src/main/groovy/com/netflix/spinnaker/orca/bakery/api/BakeRequest.groovy b/orca-bakery/src/main/groovy/com/netflix/spinnaker/orca/bakery/api/BakeRequest.groovy index 1c28541782..eb1b70b656 100644 --- a/orca-bakery/src/main/groovy/com/netflix/spinnaker/orca/bakery/api/BakeRequest.groovy +++ b/orca-bakery/src/main/groovy/com/netflix/spinnaker/orca/bakery/api/BakeRequest.groovy @@ -18,9 +18,9 @@ package com.netflix.spinnaker.orca.bakery.api import com.fasterxml.jackson.annotation.JsonAnyGetter import com.fasterxml.jackson.annotation.JsonAnySetter +import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.databind.PropertyNamingStrategy import static com.fasterxml.jackson.databind.PropertyNamingStrategy.* import com.netflix.spinnaker.kork.artifacts.model.Artifact import groovy.transform.CompileStatic @@ -66,7 +66,7 @@ class BakeRequest { @JsonInclude(JsonInclude.Include.NON_NULL) Integer rootVolumeSize - @JsonAnySetter + @JsonIgnore Map other = new HashMap<>() @JsonAnyGetter @@ -74,6 +74,11 @@ class BakeRequest { return other } + @JsonAnySetter + public void set(String name, Object value) { + other.put(namingStrategy.translate(name), value) + } + static enum CloudProviderType { aws, azure, docker, gce, openstack, titus, oracle } diff --git a/orca-bakery/src/main/groovy/com/netflix/spinnaker/orca/bakery/config/BakeryConfiguration.groovy b/orca-bakery/src/main/groovy/com/netflix/spinnaker/orca/bakery/config/BakeryConfiguration.groovy index d444803bb9..fb87511c28 100644 --- a/orca-bakery/src/main/groovy/com/netflix/spinnaker/orca/bakery/config/BakeryConfiguration.groovy +++ b/orca-bakery/src/main/groovy/com/netflix/spinnaker/orca/bakery/config/BakeryConfiguration.groovy @@ -21,7 +21,7 @@ import retrofit.RequestInterceptor import java.text.SimpleDateFormat import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.databind.PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy +import com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy import com.netflix.spinnaker.orca.bakery.api.BakeryService import com.netflix.spinnaker.orca.config.OrcaConfiguration import com.netflix.spinnaker.orca.retrofit.RetrofitConfiguration @@ -63,20 +63,24 @@ class BakeryConfiguration { @Bean BakeryService bakery(Endpoint bakeryEndpoint) { - def objectMapper = new ObjectMapper() - .setPropertyNamingStrategy(new LowerCaseWithUnderscoresStrategy()) - .setDateFormat(new SimpleDateFormat("YYYYMMDDHHmm")) - .setSerializationInclusion(NON_NULL) - .disable(FAIL_ON_UNKNOWN_PROPERTIES) new RestAdapter.Builder() .setEndpoint(bakeryEndpoint) .setRequestInterceptor(spinnakerRequestInterceptor) - .setConverter(new JacksonConverter(objectMapper)) + .setConverter(new JacksonConverter(bakeryConfiguredObjectMapper())) .setClient(retrofitClient) .setLogLevel(retrofitLogLevel) .setLog(new RetrofitSlf4jLog(BakeryService)) .build() .create(BakeryService) } + + static ObjectMapper bakeryConfiguredObjectMapper() { + def objectMapper = new ObjectMapper() + .setPropertyNamingStrategy(new SnakeCaseStrategy()) + .setDateFormat(new SimpleDateFormat("YYYYMMDDHHmm")) + .setSerializationInclusion(NON_NULL) + .disable(FAIL_ON_UNKNOWN_PROPERTIES) + + } } diff --git a/orca-bakery/src/test/groovy/com/netflix/spinnaker/orca/bakery/api/BakeRequestSpec.groovy b/orca-bakery/src/test/groovy/com/netflix/spinnaker/orca/bakery/api/BakeRequestSpec.groovy new file mode 100644 index 0000000000..0c3b39a202 --- /dev/null +++ b/orca-bakery/src/test/groovy/com/netflix/spinnaker/orca/bakery/api/BakeRequestSpec.groovy @@ -0,0 +1,37 @@ +package com.netflix.spinnaker.orca.bakery.api + +import com.fasterxml.jackson.databind.SerializationFeature +import com.netflix.spinnaker.orca.bakery.config.BakeryConfiguration +import spock.lang.Specification + + +class BakeRequestSpec extends Specification { + + def "it snakes the other"() { + given: + def json = '''\ + { + "templateFileLocation": "C:/windows/system32", + "extendedAttributes": { + "a_snake_attribute": "hiss", + "aCamelAttribute": "humps" + } + }'''.stripIndent() + def mapper = BakeryConfiguration.bakeryConfiguredObjectMapper().enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS) + def bakeReq = mapper.readValue(json, BakeRequest) + + when: + def output = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(bakeReq).trim() + + then: + output == '''\ + { + "extended_attributes" : { + "aCamelAttribute" : "humps", + "a_snake_attribute" : "hiss" + }, + "template_file_location" : "C:/windows/system32" + }'''.stripIndent() + } + +}