diff --git a/server/configs/application-dev.yml b/server/configs/application-dev.yml deleted file mode 100644 index 30f8d964..00000000 --- a/server/configs/application-dev.yml +++ /dev/null @@ -1,5 +0,0 @@ -extender: - cache: - enabled: true - type: LOCAL - local.basedir: /var/extender/cache/data diff --git a/server/configs/application-local-dev-android.yml b/server/configs/application-local-dev-android.yml index eeffcff2..69788e41 100644 --- a/server/configs/application-local-dev-android.yml +++ b/server/configs/application-local-dev-android.yml @@ -1 +1,4 @@ -extender.gradle.enabled: true +extender: + instance-type: BUILDER_ONLY + gradle: + enabled: true diff --git a/server/configs/application-local-dev-app.yml b/server/configs/application-local-dev-app.yml index 57e0bbc1..c69ffbc6 100644 --- a/server/configs/application-local-dev-app.yml +++ b/server/configs/application-local-dev-app.yml @@ -1,4 +1,5 @@ extender: + instance-type: FRONTEND_ONLY remote-builder: enabled: true platforms: diff --git a/server/configs/application-local-dev.yml b/server/configs/application-local-dev.yml index 0ec92335..31ec59d6 100644 --- a/server/configs/application-local-dev.yml +++ b/server/configs/application-local-dev.yml @@ -1,4 +1,5 @@ extender: + instance-type: BUILDER_ONLY # sdk.location: /usr/local/extender/sdk cache: enabled: true diff --git a/server/configs/application-standalone-dev.yml b/server/configs/application-standalone-dev.yml index 21f69ae3..0274c2c4 100644 --- a/server/configs/application-standalone-dev.yml +++ b/server/configs/application-standalone-dev.yml @@ -2,6 +2,7 @@ server: port: 9010 extender: + instance-type: MIXED sdk: location: /usr/local/extender/sdk cache-clear-on-exit: false diff --git a/server/configs/application-test-app.yml b/server/configs/application-test-app.yml index e43a4cae..e3551f65 100644 --- a/server/configs/application-test-app.yml +++ b/server/configs/application-test-app.yml @@ -1,4 +1,5 @@ extender: + instance-type: FRONTEND_ONLY remote-builder: enabled: true platforms: diff --git a/server/src/main/java/com/defold/extender/ExtenderController.java b/server/src/main/java/com/defold/extender/ExtenderController.java index f14f2b11..3da49fdf 100644 --- a/server/src/main/java/com/defold/extender/ExtenderController.java +++ b/server/src/main/java/com/defold/extender/ExtenderController.java @@ -33,6 +33,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import jakarta.transaction.NotSupportedException; import java.io.File; import java.io.FileInputStream; @@ -46,9 +47,14 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; - @RestController public class ExtenderController { + public enum InstanceType { + MIXED, + FRONTEND_ONLY, + BUILDER_ONLY + }; + private static final Logger LOGGER = LoggerFactory.getLogger(ExtenderController.class); private static final String LATEST = "latest"; @@ -65,6 +71,8 @@ public class ExtenderController { private final RemoteEngineBuilder remoteEngineBuilder; private Map remoteBuilderPlatformMappings; + @Value("${extender.instance-type:MIXED}") + private InstanceType instanceType; private final boolean remoteBuilderEnabled; private static long maxPackageSize = 1024*1024*1024; @@ -198,17 +206,31 @@ public void buildEngineAsync(HttpServletRequest _request, // Regardless of success/fail status, we want to cache the uploaded files DataCacheService.DataCacheServiceInfo uploadResultInfo = dataCacheService.cacheFiles(uploadDirectory); metricsWriter.measureCacheUpload(uploadResultInfo.cachedFileSize.longValue(), uploadResultInfo.cachedFileCount.intValue()); - - String[] buildEnvDescription = ExtenderUtil.getSdksForPlatform(platform, defoldSdkService.getPlatformSdkMappings(sdkVersion)); - // Build engine locally or on remote builder - if (remoteBuilderEnabled && isRemotePlatform(buildEnvDescription[0], buildEnvDescription[1])) { - LOGGER.info("Building engine on remote builder"); - RemoteInstanceConfig remoteInstanceConfig = getRemoteBuilderConfig(buildEnvDescription[0], buildEnvDescription[1]); - this.remoteEngineBuilder.buildAsync(remoteInstanceConfig, uploadDirectory, platform, sdkVersion, jobDirectory, buildDirectory, metricsWriter); - } else { + + if (instanceType.equals(InstanceType.BUILDER_ONLY)) { asyncBuilder.asyncBuildEngine(metricsWriter, platform, sdkVersion, jobDirectory, uploadDirectory, buildDirectory); + } else { + String[] buildEnvDescription = null; + try { + // sdk version was removed (dev or beta) + buildEnvDescription = ExtenderUtil.getSdksForPlatform(platform, defoldSdkService.getPlatformSdkMappings(sdkVersion)); + } catch(ExtenderException exc) { + if (instanceType.equals(InstanceType.FRONTEND_ONLY)) { + throw new NotSupportedException("Engine version unsupported. Please, update engine to the newer version."); + } + } + // Build engine locally or on remote builder + if (remoteBuilderEnabled && buildEnvDescription != null && isRemotePlatform(buildEnvDescription[0], buildEnvDescription[1])) { + LOGGER.info("Building engine on remote builder"); + RemoteInstanceConfig remoteInstanceConfig = getRemoteBuilderConfig(buildEnvDescription[0], buildEnvDescription[1]); + this.remoteEngineBuilder.buildAsync(remoteInstanceConfig, uploadDirectory, platform, sdkVersion, jobDirectory, buildDirectory, metricsWriter); + } else if (instanceType.equals(InstanceType.MIXED)) { + asyncBuilder.asyncBuildEngine(metricsWriter, platform, sdkVersion, jobDirectory, uploadDirectory, buildDirectory); + } else { + // no remote buidler was found and current instance can't build + throw new NotSupportedException("Engine version unsupported. Please, update engine to the newer version."); + } } - response.getWriter().write(jobDirectory.getName()); response.getWriter().flush(); response.getWriter().close(); @@ -218,6 +240,9 @@ public void buildEngineAsync(HttpServletRequest _request, throw new ExtenderException(e, "Client closed connection prematurely, build aborted"); } catch(FileUploadException e) { throw new ExtenderException(e, "Bad request: " + e.getMessage()); + } catch(NotSupportedException e) { + LOGGER.error("Unsupported engine version {}", sdkVersionString); + throw new ExtenderException("Unsupported engine version. Please, update engine to the newer version"); } catch(Exception e) { LOGGER.error(String.format("Exception while building or sending response - SDK: %s", sdkVersion)); throw e; diff --git a/server/src/main/java/com/defold/extender/services/DefoldSdkService.java b/server/src/main/java/com/defold/extender/services/DefoldSdkService.java index 2ee3ce1b..a8420dd5 100644 --- a/server/src/main/java/com/defold/extender/services/DefoldSdkService.java +++ b/server/src/main/java/com/defold/extender/services/DefoldSdkService.java @@ -356,7 +356,9 @@ private JSONObject getRemotePlatformSdkMappings(String hash) throws IOException, try { JSONObject result = operation.get(); if (result == null) { - throw new ExtenderException(String.format("Cannot find or parse platform sdks mappings for hash: %s", hash)); + String msg = String.format("Cannot find or parse platform sdks mappings for hash: %s", hash); + LOGGER.error(msg); + throw new ExtenderException(msg); } return result; } catch (InterruptedException|ExecutionException exc) { diff --git a/server/src/main/resources/application.yml b/server/src/main/resources/application.yml index a89d735e..df59544e 100644 --- a/server/src/main/resources/application.yml +++ b/server/src/main/resources/application.yml @@ -50,6 +50,9 @@ extender: location: /tmp/results cleanup-period: 20000 lifetime: 1200000 + # see ExtenderController.InstanceType enum + # FRONTEND_ONLY, BUILDER_ONLY, MIXED + instance-type: MIXED spring: application: diff --git a/server/src/test/java/com/defold/extender/IntegrationTest.java b/server/src/test/java/com/defold/extender/IntegrationTest.java index c036c6f9..f2827272 100644 --- a/server/src/test/java/com/defold/extender/IntegrationTest.java +++ b/server/src/test/java/com/defold/extender/IntegrationTest.java @@ -9,6 +9,7 @@ import org.jf.dexlib2.iface.DexFile; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import org.slf4j.Logger; @@ -568,4 +569,19 @@ public void buildEngineWithDynamicLibs(TestConfiguration configuration) throws I assertNotNull(zipFile.getEntry(getDynamicLibName(configuration.platform, "dynamic_specific2"))); } } + + @Test + public void testUnsupportedVersion() throws IOException, ExtenderClientException { + TestConfiguration configuration = new TestConfiguration(new DefoldVersion("non-exist", new Version(2, 10, 1), new String[]{ "x86_64-linux" }) , "x86_64-linux"); + List sourceFiles = Lists.newArrayList( + new FileExtenderResource("test-data/AndroidManifest.xml", "AndroidManifest.xml"), + new FileExtenderResource("test-data/ext2/ext.manifest"), + new FileExtenderResource("test-data/ext2/src/test_ext.cpp"), + new FileExtenderResource(String.format("test-data/ext2/lib/%s/%s", configuration.platform, getLibName(configuration.platform, "alib"))), + new FileExtenderResource(String.format("test-data/ext2/lib/%s/%s", configuration.platform, getLibName(configuration.platform, "blib"))) + ); + + ExtenderClientException exc = assertThrows(ExtenderClientException.class, () -> doBuild(sourceFiles, configuration)); + assertTrue(exc.getMessage().contains("Unsupported engine version")); + } }