From 09d29b1df4f465171cf7e7d7ea38b2e04b5fbac0 Mon Sep 17 00:00:00 2001 From: j-sandy <30489233+j-sandy@users.noreply.github.com> Date: Thu, 26 Dec 2024 11:28:12 +0530 Subject: [PATCH 1/5] chore(dependency): upgrade spring boot from 2.7.x to 3.0.x and spring cloud from 2021.0.x to 2022.0.x Upgrading spring boot 2.7.18 to 3.0.13 and spring cloud 2021.0.8 to 2022.0.5. Spring cloud release 2022.0.x is compatible with spring boot 3.0.x. https://github.com/spring-cloud/spring-cloud-release/wiki/Supported-Versions#supported-releases ====================================================== refactor(dependency): replace javax with jakarta during upgrade of spring boot 3.0.x Spring Boot 3.0 has migrated from Java EE to Jakarta EE APIs for all dependencies. https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes#third-party-library-upgrades So, replacing the imports with `javax` to `jakarta`. --- fiat-api/fiat-api.gradle | 2 +- .../AuthenticatedRequestAuthenticationConverter.java | 2 +- .../fiat/shared/FiatAccessDeniedExceptionHandler.java | 4 ++-- .../fiat/shared/FiatAuthenticationConverter.java | 2 +- .../fiat/shared/FiatAuthenticationFilter.java | 10 +++++----- .../netflix/spinnaker/fiat/shared/HeadersRedactor.java | 2 +- .../shared/FiatAccessDeniedExceptionHandlerSpec.groovy | 4 ++-- fiat-github/fiat-github.gradle | 2 +- .../spinnaker/fiat/roles/github/GitHubProperties.java | 8 ++++---- .../fiat/permissions/SqlPermissionsRepository.kt | 2 +- .../fiat/controllers/AuthorizeController.java | 2 +- .../spinnaker/fiat/controllers/RolesController.java | 2 +- .../fiat/controllers/AuthorizeControllerSpec.groovy | 2 +- 13 files changed, 22 insertions(+), 22 deletions(-) diff --git a/fiat-api/fiat-api.gradle b/fiat-api/fiat-api.gradle index 2647e387f..796c17d66 100644 --- a/fiat-api/fiat-api.gradle +++ b/fiat-api/fiat-api.gradle @@ -33,7 +33,7 @@ dependencies { implementation "com.squareup.retrofit2:converter-jackson" implementation "org.apache.commons:commons-lang3" - compileOnly "javax.servlet:javax.servlet-api" + compileOnly "jakarta.servlet:jakarta.servlet-api" implementation "com.github.ben-manes.caffeine:caffeine" diff --git a/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/AuthenticatedRequestAuthenticationConverter.java b/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/AuthenticatedRequestAuthenticationConverter.java index 56f837705..65f8ca722 100644 --- a/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/AuthenticatedRequestAuthenticationConverter.java +++ b/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/AuthenticatedRequestAuthenticationConverter.java @@ -17,8 +17,8 @@ package com.netflix.spinnaker.fiat.shared; import com.netflix.spinnaker.security.AuthenticatedRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.List; -import javax.servlet.http.HttpServletRequest; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.authority.AuthorityUtils; diff --git a/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAccessDeniedExceptionHandler.java b/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAccessDeniedExceptionHandler.java index 5028c6079..44ff995ad 100644 --- a/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAccessDeniedExceptionHandler.java +++ b/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAccessDeniedExceptionHandler.java @@ -18,11 +18,11 @@ import com.netflix.spinnaker.kork.api.exceptions.AccessDeniedDetails; import com.netflix.spinnaker.kork.web.exceptions.ExceptionMessageDecorator; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Map; import java.util.StringJoiner; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.web.servlet.error.DefaultErrorAttributes; diff --git a/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAuthenticationConverter.java b/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAuthenticationConverter.java index 92d30494e..5de7d860a 100644 --- a/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAuthenticationConverter.java +++ b/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAuthenticationConverter.java @@ -19,8 +19,8 @@ import com.netflix.spinnaker.fiat.model.SpinnakerAuthorities; import com.netflix.spinnaker.fiat.model.UserPermission; import com.netflix.spinnaker.kork.common.Header; +import jakarta.servlet.http.HttpServletRequest; import java.util.List; -import javax.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; diff --git a/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAuthenticationFilter.java b/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAuthenticationFilter.java index 895214ba5..767d6d204 100644 --- a/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAuthenticationFilter.java +++ b/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAuthenticationFilter.java @@ -16,12 +16,12 @@ package com.netflix.spinnaker.fiat.shared; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpFilter; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpFilter; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; diff --git a/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/HeadersRedactor.java b/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/HeadersRedactor.java index 550838946..9b714c5a1 100644 --- a/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/HeadersRedactor.java +++ b/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/HeadersRedactor.java @@ -16,10 +16,10 @@ package com.netflix.spinnaker.fiat.shared; +import jakarta.servlet.http.HttpServletRequest; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; -import javax.servlet.http.HttpServletRequest; class HeadersRedactor { diff --git a/fiat-api/src/test/groovy/com/netflix/spinnaker/fiat/shared/FiatAccessDeniedExceptionHandlerSpec.groovy b/fiat-api/src/test/groovy/com/netflix/spinnaker/fiat/shared/FiatAccessDeniedExceptionHandlerSpec.groovy index 7c164588c..6643c68b8 100644 --- a/fiat-api/src/test/groovy/com/netflix/spinnaker/fiat/shared/FiatAccessDeniedExceptionHandlerSpec.groovy +++ b/fiat-api/src/test/groovy/com/netflix/spinnaker/fiat/shared/FiatAccessDeniedExceptionHandlerSpec.groovy @@ -32,8 +32,8 @@ import spock.lang.Subject import org.springframework.security.access.AccessDeniedException import spock.lang.Unroll -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse class FiatAccessDeniedExceptionHandlerSpec extends FiatSharedSpecification { diff --git a/fiat-github/fiat-github.gradle b/fiat-github/fiat-github.gradle index 0f1a5a3f9..d0b7f82d0 100644 --- a/fiat-github/fiat-github.gradle +++ b/fiat-github/fiat-github.gradle @@ -8,7 +8,7 @@ dependencies { implementation "com.squareup.retrofit2:converter-jackson" implementation "io.spinnaker.kork:kork-web" implementation "io.spinnaker.kork:kork-retrofit" - implementation "javax.validation:validation-api" + implementation "jakarta.validation:jakarta.validation-api" testImplementation "com.github.tomakehurst:wiremock-jre8-standalone" } diff --git a/fiat-github/src/main/java/com/netflix/spinnaker/fiat/roles/github/GitHubProperties.java b/fiat-github/src/main/java/com/netflix/spinnaker/fiat/roles/github/GitHubProperties.java index 542893bd4..4eef29cd0 100644 --- a/fiat-github/src/main/java/com/netflix/spinnaker/fiat/roles/github/GitHubProperties.java +++ b/fiat-github/src/main/java/com/netflix/spinnaker/fiat/roles/github/GitHubProperties.java @@ -1,9 +1,9 @@ package com.netflix.spinnaker.fiat.roles.github; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import lombok.Data; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/fiat-sql/src/main/kotlin/com/netflix/spinnaker/fiat/permissions/SqlPermissionsRepository.kt b/fiat-sql/src/main/kotlin/com/netflix/spinnaker/fiat/permissions/SqlPermissionsRepository.kt index 8946792f3..0f80e32fe 100644 --- a/fiat-sql/src/main/kotlin/com/netflix/spinnaker/fiat/permissions/SqlPermissionsRepository.kt +++ b/fiat-sql/src/main/kotlin/com/netflix/spinnaker/fiat/permissions/SqlPermissionsRepository.kt @@ -46,7 +46,7 @@ import java.time.Clock import java.time.Duration import java.util.* import java.util.concurrent.atomic.AtomicReference -import javax.annotation.PreDestroy +import jakarta.annotation.PreDestroy import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract import kotlin.coroutines.CoroutineContext diff --git a/fiat-web/src/main/java/com/netflix/spinnaker/fiat/controllers/AuthorizeController.java b/fiat-web/src/main/java/com/netflix/spinnaker/fiat/controllers/AuthorizeController.java index aac2f801f..4c0804103 100644 --- a/fiat-web/src/main/java/com/netflix/spinnaker/fiat/controllers/AuthorizeController.java +++ b/fiat-web/src/main/java/com/netflix/spinnaker/fiat/controllers/AuthorizeController.java @@ -31,12 +31,12 @@ import com.netflix.spinnaker.kork.web.exceptions.NotFoundException; import com.netflix.spinnaker.security.AuthenticatedRequest; import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; import java.util.function.Supplier; import java.util.stream.Collectors; import javax.annotation.Nonnull; -import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.springframework.beans.factory.annotation.Autowired; diff --git a/fiat-web/src/main/java/com/netflix/spinnaker/fiat/controllers/RolesController.java b/fiat-web/src/main/java/com/netflix/spinnaker/fiat/controllers/RolesController.java index 7a1e78d56..d8479b48b 100644 --- a/fiat-web/src/main/java/com/netflix/spinnaker/fiat/controllers/RolesController.java +++ b/fiat-web/src/main/java/com/netflix/spinnaker/fiat/controllers/RolesController.java @@ -23,10 +23,10 @@ import com.netflix.spinnaker.fiat.permissions.PermissionsRepository; import com.netflix.spinnaker.fiat.permissions.PermissionsResolver; import com.netflix.spinnaker.fiat.roles.UserRolesSyncer; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; import java.util.stream.Collectors; -import javax.servlet.http.HttpServletResponse; import lombok.NonNull; import lombok.Setter; import lombok.extern.slf4j.Slf4j; diff --git a/fiat-web/src/test/groovy/com/netflix/spinnaker/fiat/controllers/AuthorizeControllerSpec.groovy b/fiat-web/src/test/groovy/com/netflix/spinnaker/fiat/controllers/AuthorizeControllerSpec.groovy index c0d604ebd..0b0995fcc 100644 --- a/fiat-web/src/test/groovy/com/netflix/spinnaker/fiat/controllers/AuthorizeControllerSpec.groovy +++ b/fiat-web/src/test/groovy/com/netflix/spinnaker/fiat/controllers/AuthorizeControllerSpec.groovy @@ -49,7 +49,7 @@ import spock.lang.Shared import spock.lang.Specification import spock.lang.Unroll -import javax.servlet.http.HttpServletResponse +import jakarta.servlet.http.HttpServletResponse import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content From 853a5fef702e7f60ed8198e85c8c9d7eefc656fa Mon Sep 17 00:00:00 2001 From: j-sandy <30489233+j-sandy@users.noreply.github.com> Date: Fri, 27 Dec 2024 12:46:23 +0530 Subject: [PATCH 2/5] refactor(jedis): migrate jedis from 3.x to 4.x during upgrade of spring boot 3.0.x Spring boot upgrade from 2.7.18 to 3.0.13, upgrades `redis.clients:jedis` from 3.8.0 to 4.3.2. So, migrating jedis from 3.x to 4.x by following the migration [document](https://github.com/redis/jedis/blob/master/docs/3to4.md) And for further changelogs, please refer [here](https://github.com/redis/jedis/releases/tag/v4.0.0) --- .../fiat/permissions/RedisPermissionsRepository.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fiat-roles/src/main/java/com/netflix/spinnaker/fiat/permissions/RedisPermissionsRepository.java b/fiat-roles/src/main/java/com/netflix/spinnaker/fiat/permissions/RedisPermissionsRepository.java index 20a8e7501..9487b83a2 100644 --- a/fiat-roles/src/main/java/com/netflix/spinnaker/fiat/permissions/RedisPermissionsRepository.java +++ b/fiat-roles/src/main/java/com/netflix/spinnaker/fiat/permissions/RedisPermissionsRepository.java @@ -43,7 +43,7 @@ import lombok.extern.slf4j.Slf4j; import net.jpountz.lz4.*; import redis.clients.jedis.*; -import redis.clients.jedis.commands.BinaryJedisCommands; +import redis.clients.jedis.commands.JedisBinaryCommands; import redis.clients.jedis.util.SafeEncoder; /** @@ -324,7 +324,7 @@ private byte[] getUserResourceBytesFromRedis(String id, ResourceType resourceTyp byte[] key = userKey(id, resourceType); byte[] compressedData = - redisRead(timeoutContext, (ThrowingFunction) c -> c.get(key)); + redisRead(timeoutContext, (ThrowingFunction) c -> c.get(key)); if (compressedData == null || compressedData.length == 0) { return null; @@ -577,7 +577,7 @@ Duration getTimeout() { } } - private T redisRead(TimeoutContext timeoutContext, Function fn) { + private T redisRead(TimeoutContext timeoutContext, Function fn) { return retryRegistry .retry(REDIS_READ_RETRY) .executeSupplier( From 34cdfbaa1d8a3822fcd353a06d3068086626f14c Mon Sep 17 00:00:00 2001 From: j-sandy <30489233+j-sandy@users.noreply.github.com> Date: Fri, 27 Dec 2024 18:43:55 +0530 Subject: [PATCH 3/5] refactor(spring-security): refactor spring security and spring from 5.x to 6.x with spring boot upgrade to 3.x With spring boot upgrade, spring security also upgrades from 5.x to 6.x. As per the migration [steps](https://www.baeldung.com/spring-security-migrate-5-to-6), `WebSecurityConfigurerAdapter` has been removed. So, it is not required to be extended, instead bean can be registered. `WebMvcConfigurerAdapter` class has been deprecated in Spring 5.0 and subsequently removed from spring 6.0. So, replacing it with `WebMvcConfigurer` interface for direct implementation. https://docs.spring.io/spring-framework/docs/5.0.0.RELEASE/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurerAdapter.html Removing bean of WebSecurityConfigurerAdapter, as in spring security 6.0 it is no more required. https://github.com/spring-projects/spring-security/pull/11923 https://www.baeldung.com/spring-security-migrate-5-to-6#2-websecurityconfigureradapter --- .../fiat/shared/FiatAuthenticationConfig.java | 43 ++++++------------- .../spinnaker/fiat/config/FiatConfig.java | 5 +-- 2 files changed, 16 insertions(+), 32 deletions(-) diff --git a/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAuthenticationConfig.java b/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAuthenticationConfig.java index 02771fc46..2afe28d0f 100644 --- a/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAuthenticationConfig.java +++ b/fiat-api/src/main/java/com/netflix/spinnaker/fiat/shared/FiatAuthenticationConfig.java @@ -37,7 +37,7 @@ import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.AnonymousAuthenticationFilter; import org.springframework.security.web.authentication.AuthenticationConverter; import retrofit2.Retrofit; @@ -94,9 +94,19 @@ AuthenticationConverter defaultAuthenticationConverter() { } @Bean - FiatWebSecurityConfigurerAdapter fiatSecurityConfig( - FiatStatus fiatStatus, AuthenticationConverter authenticationConverter) { - return new FiatWebSecurityConfigurerAdapter(fiatStatus, authenticationConverter); + public SecurityFilterChain configure( + HttpSecurity http, FiatStatus fiatStatus, AuthenticationConverter authenticationConverter) + throws Exception { + return http.servletApi() + .and() + .exceptionHandling() + .and() + .anonymous() + .and() + .addFilterBefore( + new FiatAuthenticationFilter(fiatStatus, authenticationConverter), + AnonymousAuthenticationFilter.class) + .build(); } @Bean @@ -105,29 +115,4 @@ FiatAccessDeniedExceptionHandler fiatAccessDeniedExceptionHandler( ExceptionMessageDecorator exceptionMessageDecorator) { return new FiatAccessDeniedExceptionHandler(exceptionMessageDecorator); } - - private static class FiatWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { - private final FiatStatus fiatStatus; - private final AuthenticationConverter authenticationConverter; - - private FiatWebSecurityConfigurerAdapter( - FiatStatus fiatStatus, AuthenticationConverter authenticationConverter) { - super(true); - this.fiatStatus = fiatStatus; - this.authenticationConverter = authenticationConverter; - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http.servletApi() - .and() - .exceptionHandling() - .and() - .anonymous() - .and() - .addFilterBefore( - new FiatAuthenticationFilter(fiatStatus, authenticationConverter), - AnonymousAuthenticationFilter.class); - } - } } diff --git a/fiat-web/src/main/java/com/netflix/spinnaker/fiat/config/FiatConfig.java b/fiat-web/src/main/java/com/netflix/spinnaker/fiat/config/FiatConfig.java index 9b74d0b74..49ec360ca 100644 --- a/fiat-web/src/main/java/com/netflix/spinnaker/fiat/config/FiatConfig.java +++ b/fiat-web/src/main/java/com/netflix/spinnaker/fiat/config/FiatConfig.java @@ -40,12 +40,12 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @Import({RetrofitConfig.class, PluginsAutoConfiguration.class}) @EnableConfigurationProperties(FiatServerConfigurationProperties.class) -public class FiatConfig extends WebMvcConfigurerAdapter { +public class FiatConfig implements WebMvcConfigurer { @Autowired private Registry registry; @@ -60,7 +60,6 @@ public void addInterceptors(InterceptorRegistry registry) { @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { - super.configureContentNegotiation(configurer); configurer.favorPathExtension(false).defaultContentType(MediaType.APPLICATION_JSON); } From 970842a11de65da71820a35b91ef9ad6bc52f10c Mon Sep 17 00:00:00 2001 From: j-sandy <30489233+j-sandy@users.noreply.github.com> Date: Fri, 3 Jan 2025 12:39:43 +0530 Subject: [PATCH 4/5] refactor(test): remove trailing slash from mock url template with spring boot upgrade to 3.x With spring boot upgrade, spring framework also upgrades from 5.x to 6.x. In spring framework 6.0, the trailing slash matching configuration option has been deprecated and its default value set to false. https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-6.0-Release-Notes#web-applications Due to this change, encountered the below test failure: ``` Condition failed with Exception: mockMvc.perform(get("/authorize/")) .andExpect(status().isOk()) .andExpect(content().json(expected)) | | | | | | | | | | | | | | | | | | java.lang.AssertionError: Status expected:<200> but was:<404> | | | at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59) | | | at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:122) | | | at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:637) | | | at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214) | | | at com.netflix.spinnaker.fiat.controllers.AuthorizeControllerSpec.should get user from repo via endpoint(AuthorizeControllerSpec.groovy:180) | | | Condition failed with Exception: mockMvc.perform(get("/authorize/")) .andExpect(status().isOk()) .andExpect(content().json(expected)) | | | | | | | | | | | | | | | | | | java.lang.AssertionError: Status expected:<200> but was:<404> | | | at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59) | | | at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:122) | | | at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:637) | | | at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214) | | | at com.netflix.spinnaker.fiat.controllers.AuthorizeControllerSpec.should get user from repo via endpoint(AuthorizeControllerSpec.groovy:180) | | | at com.netflix.spinnaker.fiat.controllers.AuthorizeControllerSpec.should get user from repo via endpoint(AuthorizeControllerSpec.groovy:181) Caused by: java.lang.AssertionError: Status expected:<200> but was:<404> at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59) at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:122) at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:637) at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214) at com.netflix.spinnaker.fiat.controllers.AuthorizeControllerSpec.should get user from repo via endpoint(AuthorizeControllerSpec.groovy:180) ``` In order to fix this issue, removed the trailing slash from the mock url `/authorize`. --- .../spinnaker/fiat/controllers/AuthorizeControllerSpec.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fiat-web/src/test/groovy/com/netflix/spinnaker/fiat/controllers/AuthorizeControllerSpec.groovy b/fiat-web/src/test/groovy/com/netflix/spinnaker/fiat/controllers/AuthorizeControllerSpec.groovy index 0b0995fcc..0ff40e636 100644 --- a/fiat-web/src/test/groovy/com/netflix/spinnaker/fiat/controllers/AuthorizeControllerSpec.groovy +++ b/fiat-web/src/test/groovy/com/netflix/spinnaker/fiat/controllers/AuthorizeControllerSpec.groovy @@ -164,7 +164,7 @@ class AuthorizeControllerSpec extends Specification { then: - mockMvc.perform(get("/authorize/")).andExpect(status().is4xxClientError()) + mockMvc.perform(get("/authorize")).andExpect(status().is4xxClientError()) when: fiatServerConfigurationProperties.setGetAllEnabled(true) @@ -176,7 +176,7 @@ class AuthorizeControllerSpec extends Specification { roleAroleBUser.view]) then: - mockMvc.perform(get("/authorize/")) + mockMvc.perform(get("/authorize")) .andExpect(status().isOk()) .andExpect(content().json(expected)) } From bc8f5d2679774513bf9ceeaf8c90043969b260f6 Mon Sep 17 00:00:00 2001 From: j-sandy <30489233+j-sandy@users.noreply.github.com> Date: Fri, 3 Jan 2025 13:21:25 +0530 Subject: [PATCH 5/5] refactor(dependency): add explicit resilience4j-vavr dependency with spring boot upgrade to 3.x While upgrading the spring boot to 3.0.13 and spring cloud 2022.0.5, encountered the below error: ``` > Task :fiat-sql:compileKotlin FAILED e: /fiat/fiat-sql/src/main/kotlin/com/netflix/spinnaker/fiat/permissions/SqlPermissionsRepository.kt: (36, 11): Unresolved reference: vavr e: /fiat/fiat-sql/src/main/kotlin/com/netflix/spinnaker/fiat/permissions/SqlPermissionsRepository.kt: (49, 25): Unresolved reference: PreDestroy e: /fiat/fiat-sql/src/main/kotlin/com/netflix/spinnaker/fiat/permissions/SqlPermissionsRepository.kt: (550, 13): Unresolved reference: Try e: /fiat/fiat-sql/src/main/kotlin/com/netflix/spinnaker/fiat/permissions/SqlPermissionsRepository.kt: (561, 13): Unresolved reference: Try e: /fiat/fiat-sql/src/main/kotlin/com/netflix/spinnaker/fiat/permissions/SqlPermissionsRepository.kt: (599, 6): Unresolved reference: PreDestroy FAILURE: Build completed with 2 failures. ``` The root cause of this issue is removal of `io.vavr` dependency from resilience4j:2.0.2. https://github.com/resilience4j/resilience4j/releases/tag/v2.0.0 Resilience4j comes as transitive dependency of spring-cloud-dependencies. https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies/2022.0.5 Dependency insight before spring cloud upgrade: ``` $ ./gradlew fiat-sql:dI --dependency io.vavr:vavr: > Task :fiat-sql:dependencyInsight io.vavr:vavr:0.10.2 Variant compile: | Attribute Name | Provided | Requested | |------------------------------------|----------|-------------------| | org.gradle.status | release | | | org.gradle.category | library | library | | org.gradle.libraryelements | jar | classes+resources | | org.gradle.usage | java-api | java-api | | org.gradle.dependency.bundling | | external | | org.gradle.jvm.environment | | standard-jvm | | org.gradle.jvm.version | | 17 | | org.jetbrains.kotlin.platform.type | | jvm | io.vavr:vavr:0.10.2 +--- io.github.resilience4j:resilience4j-annotations:1.7.0 | +--- io.spinnaker.kork:kork-bom:7.247.0 | | \--- compileClasspath | +--- io.spinnaker.kork:kork-core:7.247.0 | | +--- io.spinnaker.kork:kork-bom:7.247.0 (*) | | +--- io.spinnaker.kork:kork-sql:7.247.0 | | | +--- compileClasspath (requested io.spinnaker.kork:kork-sql) | | | \--- io.spinnaker.kork:kork-bom:7.247.0 (*) | | \--- io.spinnaker.kork:kork-web:7.247.0 | | +--- compileClasspath (requested io.spinnaker.kork:kork-web) | | \--- io.spinnaker.kork:kork-bom:7.247.0 (*) | \--- io.github.resilience4j:resilience4j-spring:1.7.0 | +--- io.spinnaker.kork:kork-bom:7.247.0 (*) | \--- io.github.resilience4j:resilience4j-spring-boot2:1.7.0 | +--- io.spinnaker.kork:kork-bom:7.247.0 (*) | \--- io.spinnaker.kork:kork-core:7.247.0 (*) +--- io.github.resilience4j:resilience4j-bulkhead:1.7.0 | +--- io.spinnaker.kork:kork-bom:7.247.0 (*) | \--- io.github.resilience4j:resilience4j-framework-common:1.7.0 | \--- io.github.resilience4j:resilience4j-spring:1.7.0 (*) +--- io.github.resilience4j:resilience4j-circuitbreaker:1.7.0 | +--- io.spinnaker.kork:kork-bom:7.247.0 (*) | \--- io.github.resilience4j:resilience4j-framework-common:1.7.0 (*) +--- io.github.resilience4j:resilience4j-circularbuffer:1.7.0 | +--- io.spinnaker.kork:kork-bom:7.247.0 (*) | \--- io.github.resilience4j:resilience4j-consumer:1.7.0 | +--- io.spinnaker.kork:kork-bom:7.247.0 (*) | \--- io.github.resilience4j:resilience4j-spring:1.7.0 (*) +--- io.github.resilience4j:resilience4j-consumer:1.7.0 (*) +--- io.github.resilience4j:resilience4j-core:1.7.0 | +--- io.spinnaker.kork:kork-bom:7.247.0 (*) | +--- io.github.resilience4j:resilience4j-framework-common:1.7.0 (*) | +--- io.github.resilience4j:resilience4j-retry:1.7.0 | | +--- compileClasspath (requested io.github.resilience4j:resilience4j-retry) | | +--- io.spinnaker.kork:kork-bom:7.247.0 (*) | | +--- io.spinnaker.kork:kork-core:7.247.0 (*) | | \--- io.github.resilience4j:resilience4j-framework-common:1.7.0 (*) | +--- io.github.resilience4j:resilience4j-consumer:1.7.0 (*) | +--- io.github.resilience4j:resilience4j-circuitbreaker:1.7.0 (*) | +--- io.github.resilience4j:resilience4j-ratelimiter:1.7.0 | | +--- io.spinnaker.kork:kork-bom:7.247.0 (*) | | \--- io.github.resilience4j:resilience4j-framework-common:1.7.0 (*) | +--- io.github.resilience4j:resilience4j-bulkhead:1.7.0 (*) | \--- io.github.resilience4j:resilience4j-timelimiter:1.7.0 | +--- io.spinnaker.kork:kork-bom:7.247.0 (*) | \--- io.github.resilience4j:resilience4j-framework-common:1.7.0 (*) +--- io.github.resilience4j:resilience4j-framework-common:1.7.0 (*) +--- io.github.resilience4j:resilience4j-micrometer:1.7.0 | +--- io.spinnaker.kork:kork-bom:7.247.0 (*) | \--- io.github.resilience4j:resilience4j-spring-boot2:1.7.0 (*) +--- io.github.resilience4j:resilience4j-ratelimiter:1.7.0 (*) +--- io.github.resilience4j:resilience4j-retry:1.7.0 (*) +--- io.github.resilience4j:resilience4j-spring:1.7.0 (*) +--- io.github.resilience4j:resilience4j-spring-boot2:1.7.0 (*) \--- io.github.resilience4j:resilience4j-timelimiter:1.7.0 (*) ``` After spring cloud upgrade: ``` $ ./gradlew fiat-sql:dI --dependency io.vavr:vavr: > Task :fiat-sql:dependencyInsight No dependencies matching given input were found in configuration ':fiat-sql:compileClasspath' ``` In order to fix this issue adding explicit dependency of `resilience4j-vavr`. After adding dependency: ``` $ ./gradlew fiat-sql:dI --dependency io.vavr:vavr: > Task :fiat-sql:dependencyInsight io.vavr:vavr:0.10.2 Variant compile: | Attribute Name | Provided | Requested | |------------------------------------|----------|-------------------| | org.gradle.status | release | | | org.gradle.category | library | library | | org.gradle.libraryelements | jar | classes+resources | | org.gradle.usage | java-api | java-api | | org.gradle.dependency.bundling | | external | | org.gradle.jvm.environment | | standard-jvm | | org.gradle.jvm.version | | 17 | | org.jetbrains.kotlin.platform.type | | jvm | io.vavr:vavr:0.10.2 \--- io.github.resilience4j:resilience4j-vavr:2.0.2 +--- compileClasspath (requested io.github.resilience4j:resilience4j-vavr) \--- io.spinnaker.kork:kork-bom:sb-3-0-13-2-SNAPSHOT \--- compileClasspath ``` --- fiat-sql/fiat-sql.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/fiat-sql/fiat-sql.gradle b/fiat-sql/fiat-sql.gradle index 5e7fe80d1..eec76bfd1 100644 --- a/fiat-sql/fiat-sql.gradle +++ b/fiat-sql/fiat-sql.gradle @@ -32,6 +32,7 @@ dependencies { implementation "io.strikt:strikt-core" implementation "io.github.resilience4j:resilience4j-retry" + implementation "io.github.resilience4j:resilience4j-vavr" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-slf4j"