Return the default resolver if the factory URL refers directly to a devfile

Signed-off-by: Igor Vinokur <ivinokur@redhat.com>
pull/519/head
Igor Vinokur 2023-06-01 15:57:56 +03:00
parent b68fa97aa2
commit 6e1dcc2683
2 changed files with 34 additions and 0 deletions

View File

@ -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<FactoryParametersResolver> 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<String, String> 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 {

View File

@ -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);
}