From 35d9c70a0d7f883faeb22bdee2e1caf92abff7d6 Mon Sep 17 00:00:00 2001
From: root <root@b363a8ce22ba>
Date: Tue, 12 Mar 2024 17:26:58 +0000
Subject: [PATCH 1/2] chore(dependencies): Autobump korkVersion

---
 gradle.properties | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gradle.properties b/gradle.properties
index b6501fab1..7499e10f4 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,5 +1,5 @@
 fiatVersion=1.43.0
-korkVersion=7.219.0
+korkVersion=7.220.0
 org.gradle.parallel=true
 spinnakerGradleVersion=8.32.1
 targetJava11=true

From 799f2a9e40ef7c1c0287c1decc3d506f5fc196ac Mon Sep 17 00:00:00 2001
From: j-sandy <30489233+j-sandy@users.noreply.github.com>
Date: Fri, 5 Jan 2024 21:13:05 +0530
Subject: [PATCH 2/2] refactor(web): replace the path matching strategy for
 spring mvc from PathPatternParser to Ant Matcher during upgrade to spring
 boot 2.6.x

In spring boot 2.6.x default strategy for matching request paths against registered Spring MVC handler mappings has changed from AntPathMatcher to PathPatternParser [here](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.6-Release-Notes#pathpattern-based-path-matching-strategy-for-spring-mvc). This causes an incompatibility of specific pattern like `/abc/**/xyz` and `PathPattenParser` does not resolve the path. The compatibility difference is given [here](https://spring.io/blog/2020/06/30/url-matching-with-pathpattern-in-spring-mvc/#pathpattern). Encountered below error in igor-web module for this mapping `/masters/{name}/jobs/**/update/{buildNumber}` while test execution.
```
Failed to load ApplicationContext
java.lang.IllegalStateException: Failed to load ApplicationContext
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:98)
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124)
	at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190)
	at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248)
	at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:138)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$8(ClassBasedTestDescriptor.java:363)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:368)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$9(ClassBasedTestDescriptor.java:363)
	...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Invalid mapping on handler class [com.netflix.spinnaker.igor.build.BuildController]: public void com.netflix.spinnaker.igor.build.BuildController.update(java.lang.String,java.lang.Integer,com.netflix.spinnaker.igor.build.model.UpdatedBuild,javax.servlet.http.HttpServletRequest)
	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804)
	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
	at app//org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
	...
Caused by: java.lang.IllegalStateException: Invalid mapping on handler class [com.netflix.spinnaker.igor.build.BuildController]: public void com.netflix.spinnaker.igor.build.BuildController.update(java.lang.String,java.lang.Integer,com.netflix.spinnaker.igor.build.model.UpdatedBuild,javax.servlet.http.HttpServletRequest)
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lambda$detectHandlerMethods$1(AbstractHandlerMethodMapping.java:288)
	at org.springframework.core.MethodIntrospector.lambda$selectMethods$0(MethodIntrospector.java:74)
	at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:367)
	at org.springframework.core.MethodIntrospector.selectMethods(MethodIntrospector.java:72)
	at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:281)
	...
Caused by: org.springframework.web.util.pattern.PatternParseException: No more pattern data allowed after {*...} or ** pattern element
	at app//org.springframework.web.util.pattern.InternalPathPatternParser.peekDoubleWildcard(InternalPathPatternParser.java:250)
	at app//org.springframework.web.util.pattern.InternalPathPatternParser.parse(InternalPathPatternParser.java:113)
	at app//org.springframework.web.util.pattern.PathPatternParser.parse(PathPatternParser.java:110)
	at app//org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition.parse(PathPatternsRequestCondition.java:82)
	at app//org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition.<init>(PathPatternsRequestCondition.java:70)
	at app//org.springframework.web.servlet.mvc.method.RequestMappingInfo$DefaultBuilder.build(RequestMappingInfo.java:712)
	at app//org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.createRequestMappingInfo(RequestMappingHandlerMapping.java:379)
	at app//org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.createRequestMappingInfo(RequestMappingHandlerMapping.java:324)
	at app//org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getMappingForMethod(RequestMappingHandlerMapping.java:284)
	at app//org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getMappingForMethod(RequestMappingHandlerMapping.java:76)
	at app//org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lambda$detectHandlerMethods$1(AbstractHandlerMethodMapping.java:284)
	... 112 more
```
To fix this issue we can add a spring property `spring.mvc.pathmatch.matching-strategy = ANT_PATH_MATCHER` to kork-config so that it will be applicable to all the spinnaker components. But there is only 1 incompatible pattern available in [igor](https://github.com/spinnaker/igor/blob/773759404425b56d9f27a96ab3470d93d2983f4e/igor-web/src/main/groovy/com/netflix/spinnaker/igor/build/BuildController.groovy#L201) and in rest of the components all patterns are compatible with `PathPatternParser`. So updating this property only in igor.
---
 .../src/main/groovy/com/netflix/spinnaker/igor/Main.groovy  | 4 +++-
 .../src/test/java/com/netflix/spinnaker/igor/MainTest.java  | 6 +++++-
 .../spinnaker/igor/artifacts/ArtifactExtractorTest.java     | 6 +++++-
 3 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/igor-web/src/main/groovy/com/netflix/spinnaker/igor/Main.groovy b/igor-web/src/main/groovy/com/netflix/spinnaker/igor/Main.groovy
index c4e640242..82ff917ef 100644
--- a/igor-web/src/main/groovy/com/netflix/spinnaker/igor/Main.groovy
+++ b/igor-web/src/main/groovy/com/netflix/spinnaker/igor/Main.groovy
@@ -39,7 +39,9 @@ import java.security.Security
 )
 class Main extends SpringBootServletInitializer {
 
-  static final Map<String, Object> DEFAULT_PROPS = new DefaultPropertiesBuilder().property("spring.application.name", "igor").build()
+  static final Map<String, Object> DEFAULT_PROPS = new DefaultPropertiesBuilder().property("spring.application.name", "igor")
+    .property("spring.mvc.pathmatch.matching-strategy","ANT_PATH_MATCHER")
+    .build()
 
   static {
     /**
diff --git a/igor-web/src/test/java/com/netflix/spinnaker/igor/MainTest.java b/igor-web/src/test/java/com/netflix/spinnaker/igor/MainTest.java
index f3a1c9131..ebf6647e2 100644
--- a/igor-web/src/test/java/com/netflix/spinnaker/igor/MainTest.java
+++ b/igor-web/src/test/java/com/netflix/spinnaker/igor/MainTest.java
@@ -24,7 +24,11 @@
 
 @ExtendWith(SpringExtension.class)
 @SpringBootTest(classes = {RedisConfig.class, Main.class})
-@TestPropertySource(properties = {"spring.application.name = igor"})
+@TestPropertySource(
+    properties = {
+      "spring.application.name = igor",
+      "spring.mvc.pathmatch.matching-strategy = ANT_PATH_MATCHER"
+    })
 public class MainTest {
   @Test
   public void startupTest() {}
diff --git a/igor-web/src/test/java/com/netflix/spinnaker/igor/artifacts/ArtifactExtractorTest.java b/igor-web/src/test/java/com/netflix/spinnaker/igor/artifacts/ArtifactExtractorTest.java
index 71809203c..12ae4f48a 100644
--- a/igor-web/src/test/java/com/netflix/spinnaker/igor/artifacts/ArtifactExtractorTest.java
+++ b/igor-web/src/test/java/com/netflix/spinnaker/igor/artifacts/ArtifactExtractorTest.java
@@ -18,7 +18,11 @@
 
 @ExtendWith(SpringExtension.class)
 @SpringBootTest(classes = Main.class)
-@TestPropertySource(properties = {"spring.application.name = igor"})
+@TestPropertySource(
+    properties = {
+      "spring.application.name = igor",
+      "spring.mvc.pathmatch.matching-strategy = ANT_PATH_MATCHER"
+    })
 public class ArtifactExtractorTest {
 
   @Autowired private ArtifactExtractor artifactExtractor;