From 6e1dcc26838da741034b0ff300cfb923f4a1e7b6 Mon Sep 17 00:00:00 2001 From: Igor Vinokur Date: Thu, 1 Jun 2023 15:57:56 +0300 Subject: [PATCH] Return the default resolver if the factory URL refers directly to a devfile Signed-off-by: Igor Vinokur --- .../api/factory/server/FactoryService.java | 11 +++++++++ .../factory/server/FactoryServiceTest.java | 23 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryService.java b/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryService.java index e721a51c36..586772d91c 100644 --- a/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryService.java +++ b/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryService.java @@ -11,6 +11,7 @@ */ package org.eclipse.che.api.factory.server; +import static com.google.common.base.Strings.isNullOrEmpty; import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; import static java.util.Collections.singletonMap; import static org.eclipse.che.api.factory.server.ApiExceptionMapper.toApiException; @@ -39,6 +40,7 @@ import org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersiste import org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException; import org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException; import org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException; +import org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider; import org.eclipse.che.api.factory.shared.dto.FactoryMetaDto; /** @@ -176,6 +178,7 @@ public class FactoryService extends Service { private Set specificFactoryParametersResolvers; @Inject private DefaultFactoryParameterResolver defaultFactoryResolver; + @Inject private DevfileFilenamesProvider devfileFilenamesProvider; /** * Provides a suitable resolver for the given parameters. If there is no at least one resolver @@ -185,6 +188,14 @@ public class FactoryService extends Service { */ public FactoryParametersResolver getFactoryParametersResolver(Map parameters) throws BadRequestException { + String url = parameters.get(URL_PARAMETER_NAME); + // Check if the URL is a raw devfile URL. If so, use the default resolver, + // which resolves factories from a direct URL to a devfile content. + if (!isNullOrEmpty(url) + && devfileFilenamesProvider.getConfiguredDevfileFilenames().stream() + .anyMatch(url::endsWith)) { + return defaultFactoryResolver; + } for (FactoryParametersResolver factoryParametersResolver : specificFactoryParametersResolvers) { try { diff --git a/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryServiceTest.java b/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryServiceTest.java index f1b1644ab3..e9427239b5 100644 --- a/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryServiceTest.java +++ b/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryServiceTest.java @@ -14,9 +14,11 @@ package org.eclipse.che.api.factory.server; import static io.restassured.RestAssured.given; import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import static java.lang.String.valueOf; +import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static org.eclipse.che.api.factory.server.FactoryService.VALIDATE_QUERY_PARAMETER; import static org.eclipse.che.api.factory.shared.Constants.CURRENT_VERSION; +import static org.eclipse.che.api.factory.shared.Constants.URL_PARAMETER_NAME; import static org.eclipse.che.dto.server.DtoFactory.newDto; import static org.everrest.assured.JettyHttpServer.ADMIN_USER_NAME; import static org.everrest.assured.JettyHttpServer.ADMIN_USER_PASSWORD; @@ -55,6 +57,7 @@ import org.eclipse.che.api.factory.server.impl.SourceStorageParametersValidator; import org.eclipse.che.api.factory.server.model.impl.AuthorImpl; import org.eclipse.che.api.factory.server.model.impl.FactoryImpl; import org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager; +import org.eclipse.che.api.factory.server.urlfactory.DevfileFilenamesProvider; import org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl; import org.eclipse.che.api.factory.shared.dto.FactoryDto; import org.eclipse.che.api.user.server.PreferenceManager; @@ -108,6 +111,7 @@ public class FactoryServiceTest { @Mock private AdditionalFilenamesProvider additionalFilenamesProvider; @Mock private DefaultFactoryParameterResolver defaultFactoryParameterResolver; @Mock private PersonalAccessTokenManager personalAccessTokenManager; + @Mock private DevfileFilenamesProvider devfileFilenamesProvider; @InjectMocks private FactoryParametersResolverHolder factoryParametersResolverHolder; @@ -265,6 +269,25 @@ public class FactoryServiceTest { "Factory url required"); } + @Test + public void shouldReturnDefaultFactoryParameterResolver() throws Exception { + // given + when(devfileFilenamesProvider.getConfiguredDevfileFilenames()) + .thenReturn(singletonList("devfile.yaml")); + + // when + FactoryParametersResolver factoryParametersResolver = + factoryParametersResolverHolder.getFactoryParametersResolver( + singletonMap(URL_PARAMETER_NAME, "https://host/path/devfile.yaml")); + + // then + assertTrue( + factoryParametersResolver + .getClass() + .getName() + .startsWith(DefaultFactoryParameterResolver.class.getName())); + } + private FactoryImpl createFactory() { return createNamedFactory(FACTORY_NAME); }