From 03ddf1beee6a6f3c977816df0a3b8d826994cee2 Mon Sep 17 00:00:00 2001 From: Rani Date: Tue, 20 Jul 2021 08:50:20 -0700 Subject: [PATCH 1/5] feat(md): created a new endpoint for passing the http request as is without parsing the body. It will replace the current one later (cherry picked from commit f70a265317c7aabc872dc01f3f919e149d5a5d17) --- .../gate/services/internal/KeelService.java | 6 ++++++ .../gate/controllers/ManagedController.java | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java b/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java index 37b76efa4f..db0c2e93e9 100644 --- a/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java +++ b/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java @@ -40,6 +40,8 @@ import retrofit.http.Query; import retrofit.http.QueryMap; +import javax.servlet.http.HttpServletRequest; + public interface KeelService { @POST("/graphql") @@ -83,6 +85,10 @@ List> getResourceEvents( @Headers("Accept: application/json") DeliveryConfig upsertManifest(@Body DeliveryConfig manifest); + @POST("/delivery-configs/upsert") + @Headers("Accept: application/x-yaml") + DeliveryConfig upsertManifestRaw(@Body String req); + @DELETE("/delivery-configs/{name}") DeliveryConfig deleteManifest(@Path("name") String name); diff --git a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java index bd43971857..61434e5ede 100644 --- a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java +++ b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java @@ -26,6 +26,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; + import lombok.SneakyThrows; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,6 +51,8 @@ import retrofit.client.Header; import retrofit.client.Response; +import javax.servlet.http.HttpServletRequest; + @Criticality(Criticality.Value.LOW) @RequestMapping("/managed") @RestController @@ -206,6 +210,21 @@ DeliveryConfig upsertManifest(@RequestBody DeliveryConfig manifest) { .executeCallable(() -> keelService.upsertManifest(manifest)); } + @SneakyThrows + @ApiOperation( + value = "Create or update a delivery config manifest - new", + response = DeliveryConfig.class) + @PostMapping( + path = "/delivery-configs/upsert", + consumes = {APPLICATION_JSON_VALUE, APPLICATION_YAML_VALUE}, + produces = {APPLICATION_JSON_VALUE}) + DeliveryConfig upsertManifestRaw(HttpServletRequest req) { + var body = req.getReader().lines().collect(Collectors.joining()); + return retryRegistry + .retry("managed-write") + .executeCallable(() -> keelService.upsertManifestRaw(body)); + } + @ApiOperation(value = "Delete a delivery config manifest", response = DeliveryConfig.class) @DeleteMapping(path = "/delivery-configs/{name}") DeliveryConfig deleteManifest(@PathVariable("name") String name) { From 2e16db6a86bcefd9ce1faa0224d4a3e682c5a92c Mon Sep 17 00:00:00 2001 From: Rani Date: Mon, 26 Jul 2021 11:34:19 -0700 Subject: [PATCH 2/5] feat(md): removed old upsert endpoint (cherry picked from commit c80aeb1547e7fee95122fd8c64eebdd64e0c798c) --- .../gate/services/internal/KeelService.java | 6 +----- .../gate/controllers/ManagedController.java | 20 +++---------------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java b/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java index db0c2e93e9..50ff66fec1 100644 --- a/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java +++ b/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java @@ -82,12 +82,8 @@ List> getResourceEvents( List> getManifestArtifacts(@Path("name") String name); @POST("/delivery-configs") - @Headers("Accept: application/json") - DeliveryConfig upsertManifest(@Body DeliveryConfig manifest); - - @POST("/delivery-configs/upsert") @Headers("Accept: application/x-yaml") - DeliveryConfig upsertManifestRaw(@Body String req); + DeliveryConfig upsertManifest(@Body String req); @DELETE("/delivery-configs/{name}") DeliveryConfig deleteManifest(@Path("name") String name); diff --git a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java index 61434e5ede..4202529833 100644 --- a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java +++ b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java @@ -198,31 +198,17 @@ List> getManifestArtifacts(@PathVariable("name") String name @SneakyThrows @ApiOperation( - value = "Create or update a delivery config manifest", - response = DeliveryConfig.class) - @PostMapping( - path = "/delivery-configs", - consumes = {APPLICATION_JSON_VALUE, APPLICATION_YAML_VALUE}, - produces = {APPLICATION_JSON_VALUE}) - DeliveryConfig upsertManifest(@RequestBody DeliveryConfig manifest) { - return retryRegistry - .retry("managed-write") - .executeCallable(() -> keelService.upsertManifest(manifest)); - } - - @SneakyThrows - @ApiOperation( - value = "Create or update a delivery config manifest - new", + value = "Create or update a delivery config manifest", response = DeliveryConfig.class) @PostMapping( - path = "/delivery-configs/upsert", + path = "/delivery-configs", consumes = {APPLICATION_JSON_VALUE, APPLICATION_YAML_VALUE}, produces = {APPLICATION_JSON_VALUE}) DeliveryConfig upsertManifestRaw(HttpServletRequest req) { var body = req.getReader().lines().collect(Collectors.joining()); return retryRegistry .retry("managed-write") - .executeCallable(() -> keelService.upsertManifestRaw(body)); + .executeCallable(() -> keelService.upsertManifest(body)); } @ApiOperation(value = "Delete a delivery config manifest", response = DeliveryConfig.class) From 824b49d7199031e24d94ae522cf747e1b62f1b31 Mon Sep 17 00:00:00 2001 From: Rani Date: Mon, 26 Jul 2021 17:50:57 -0700 Subject: [PATCH 3/5] fix(md): switch to InputStream for better support in swagger (cherry picked from commit a04f1713c418240341401cb0467cc5d13c6c1e15) --- .../gate/controllers/ManagedController.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java index 4202529833..2d7e4b5685 100644 --- a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java +++ b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java @@ -20,15 +20,17 @@ import io.github.resilience4j.retry.RetryRegistry; import io.swagger.annotations.ApiOperation; import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import lombok.SneakyThrows; +import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -204,11 +206,13 @@ List> getManifestArtifacts(@PathVariable("name") String name path = "/delivery-configs", consumes = {APPLICATION_JSON_VALUE, APPLICATION_YAML_VALUE}, produces = {APPLICATION_JSON_VALUE}) - DeliveryConfig upsertManifestRaw(HttpServletRequest req) { - var body = req.getReader().lines().collect(Collectors.joining()); + DeliveryConfig upsertManifestRaw(@io.swagger.v3.oas.annotations.parameters.RequestBody InputStream body) { + StringWriter writer = new StringWriter(); + IOUtils.copy(body, writer, StandardCharsets.UTF_8); + String config = writer.toString(); return retryRegistry .retry("managed-write") - .executeCallable(() -> keelService.upsertManifest(body)); + .executeCallable(() -> keelService.upsertManifest(config)); } @ApiOperation(value = "Delete a delivery config manifest", response = DeliveryConfig.class) From 545d679111db3c9c2be9d31fc787d9a9ec4c16b1 Mon Sep 17 00:00:00 2001 From: Rani Date: Mon, 26 Jul 2021 21:19:42 -0700 Subject: [PATCH 4/5] fix(md): revert upsert changes until they work e2e (cherry picked from commit 9289a70779217e59b8fda275fe0407b13b5eb41e) --- .../gate/services/internal/KeelService.java | 6 +++++- .../gate/controllers/ManagedController.java | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java b/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java index 50ff66fec1..db0c2e93e9 100644 --- a/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java +++ b/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java @@ -82,8 +82,12 @@ List> getResourceEvents( List> getManifestArtifacts(@Path("name") String name); @POST("/delivery-configs") + @Headers("Accept: application/json") + DeliveryConfig upsertManifest(@Body DeliveryConfig manifest); + + @POST("/delivery-configs/upsert") @Headers("Accept: application/x-yaml") - DeliveryConfig upsertManifest(@Body String req); + DeliveryConfig upsertManifestRaw(@Body String req); @DELETE("/delivery-configs/{name}") DeliveryConfig deleteManifest(@Path("name") String name); diff --git a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java index 2d7e4b5685..3c604e120c 100644 --- a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java +++ b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java @@ -206,13 +206,27 @@ List> getManifestArtifacts(@PathVariable("name") String name path = "/delivery-configs", consumes = {APPLICATION_JSON_VALUE, APPLICATION_YAML_VALUE}, produces = {APPLICATION_JSON_VALUE}) - DeliveryConfig upsertManifestRaw(@io.swagger.v3.oas.annotations.parameters.RequestBody InputStream body) { + DeliveryConfig upsertManifest(@RequestBody DeliveryConfig manifest) { + return retryRegistry + .retry("managed-write") + .executeCallable(() -> keelService.upsertManifest(manifest)); + } + + @SneakyThrows + @ApiOperation( + value = "Create or update a delivery config manifest", + response = DeliveryConfig.class) + @PostMapping( + path = "/delivery-configs/upsert", + consumes = {APPLICATION_JSON_VALUE, APPLICATION_YAML_VALUE}, + produces = {APPLICATION_JSON_VALUE}) + DeliveryConfig upsertManifestRaw(InputStream body) { StringWriter writer = new StringWriter(); IOUtils.copy(body, writer, StandardCharsets.UTF_8); String config = writer.toString(); return retryRegistry .retry("managed-write") - .executeCallable(() -> keelService.upsertManifest(config)); + .executeCallable(() -> keelService.upsertManifestRaw(config)); } @ApiOperation(value = "Delete a delivery config manifest", response = DeliveryConfig.class) From 69e76bbb7098a3661cc7560bbc8b9919a44645df Mon Sep 17 00:00:00 2001 From: Rani Date: Wed, 28 Jul 2021 23:09:07 -0700 Subject: [PATCH 5/5] fix(md): send the raw config wrapped in a simple json to ensure that we do not mess around with the content (cherry picked from commit 914f27a727328a0fe78fdb2e58aca679a87d881e) --- .../manageddelivery/RawDeliveryConfig.java | 27 +++++++++++++++++++ .../gate/services/internal/KeelService.java | 11 +++----- .../gate/controllers/ManagedController.java | 21 +++------------ 3 files changed, 33 insertions(+), 26 deletions(-) create mode 100644 gate-core/src/main/groovy/com/netflix/spinnaker/gate/model/manageddelivery/RawDeliveryConfig.java diff --git a/gate-core/src/main/groovy/com/netflix/spinnaker/gate/model/manageddelivery/RawDeliveryConfig.java b/gate-core/src/main/groovy/com/netflix/spinnaker/gate/model/manageddelivery/RawDeliveryConfig.java new file mode 100644 index 0000000000..9f7a471f96 --- /dev/null +++ b/gate-core/src/main/groovy/com/netflix/spinnaker/gate/model/manageddelivery/RawDeliveryConfig.java @@ -0,0 +1,27 @@ +/* + * Copyright 2019 Netflix, Inc. + * + * Licensed 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. + */ + +package com.netflix.spinnaker.gate.model.manageddelivery; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; +import lombok.NonNull; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class RawDeliveryConfig { + @NonNull String content; +} diff --git a/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java b/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java index db0c2e93e9..e2121cf036 100644 --- a/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java +++ b/gate-core/src/main/java/com/netflix/spinnaker/gate/services/internal/KeelService.java @@ -24,6 +24,7 @@ import com.netflix.spinnaker.gate.model.manageddelivery.EnvironmentArtifactVeto; import com.netflix.spinnaker.gate.model.manageddelivery.GraphQLRequest; import com.netflix.spinnaker.gate.model.manageddelivery.OverrideVerificationRequest; +import com.netflix.spinnaker.gate.model.manageddelivery.RawDeliveryConfig; import com.netflix.spinnaker.gate.model.manageddelivery.Resource; import com.netflix.spinnaker.gate.model.manageddelivery.RetryVerificationRequest; import com.netflix.spinnaker.kork.plugins.SpinnakerPluginDescriptor; @@ -40,8 +41,6 @@ import retrofit.http.Query; import retrofit.http.QueryMap; -import javax.servlet.http.HttpServletRequest; - public interface KeelService { @POST("/graphql") @@ -81,13 +80,9 @@ List> getResourceEvents( @GET("/delivery-configs/{name}/artifacts") List> getManifestArtifacts(@Path("name") String name); - @POST("/delivery-configs") + @POST("/delivery-configs/upsertGate") @Headers("Accept: application/json") - DeliveryConfig upsertManifest(@Body DeliveryConfig manifest); - - @POST("/delivery-configs/upsert") - @Headers("Accept: application/x-yaml") - DeliveryConfig upsertManifestRaw(@Body String req); + DeliveryConfig upsertManifest(@Body RawDeliveryConfig req); @DELETE("/delivery-configs/{name}") DeliveryConfig deleteManifest(@Path("name") String name); diff --git a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java index 3c604e120c..ccf11e9ace 100644 --- a/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java +++ b/gate-web/src/main/groovy/com/netflix/spinnaker/gate/controllers/ManagedController.java @@ -10,6 +10,7 @@ import com.netflix.spinnaker.gate.model.manageddelivery.EnvironmentArtifactVeto; import com.netflix.spinnaker.gate.model.manageddelivery.GraphQLRequest; import com.netflix.spinnaker.gate.model.manageddelivery.OverrideVerificationRequest; +import com.netflix.spinnaker.gate.model.manageddelivery.RawDeliveryConfig; import com.netflix.spinnaker.gate.model.manageddelivery.Resource; import com.netflix.spinnaker.gate.model.manageddelivery.RetryVerificationRequest; import com.netflix.spinnaker.gate.services.NotificationService; @@ -53,8 +54,6 @@ import retrofit.client.Header; import retrofit.client.Response; -import javax.servlet.http.HttpServletRequest; - @Criticality(Criticality.Value.LOW) @RequestMapping("/managed") @RestController @@ -206,27 +205,13 @@ List> getManifestArtifacts(@PathVariable("name") String name path = "/delivery-configs", consumes = {APPLICATION_JSON_VALUE, APPLICATION_YAML_VALUE}, produces = {APPLICATION_JSON_VALUE}) - DeliveryConfig upsertManifest(@RequestBody DeliveryConfig manifest) { - return retryRegistry - .retry("managed-write") - .executeCallable(() -> keelService.upsertManifest(manifest)); - } - - @SneakyThrows - @ApiOperation( - value = "Create or update a delivery config manifest", - response = DeliveryConfig.class) - @PostMapping( - path = "/delivery-configs/upsert", - consumes = {APPLICATION_JSON_VALUE, APPLICATION_YAML_VALUE}, - produces = {APPLICATION_JSON_VALUE}) DeliveryConfig upsertManifestRaw(InputStream body) { StringWriter writer = new StringWriter(); IOUtils.copy(body, writer, StandardCharsets.UTF_8); - String config = writer.toString(); + RawDeliveryConfig config = new RawDeliveryConfig(writer.toString()); return retryRegistry .retry("managed-write") - .executeCallable(() -> keelService.upsertManifestRaw(config)); + .executeCallable(() -> keelService.upsertManifest(config)); } @ApiOperation(value = "Delete a delivery config manifest", response = DeliveryConfig.class)