diff --git a/.mvn/maven.config b/.mvn/maven.config index 26daffc4258..c474a9ccf48 100644 --- a/.mvn/maven.config +++ b/.mvn/maven.config @@ -4,4 +4,4 @@ -ntp # timefold-solver-service-parent configures maven plugins required for Timefold models, but failing the build # of that module itself. This way, we disable the plugin execution, while it remains active by default for models. --Dai.timefold.sdk.model.processing.disabled \ No newline at end of file +-Dai.timefold.model.processing.disabled \ No newline at end of file diff --git a/service/facade/service-parent/pom.xml b/service/facade/service-parent/pom.xml index 2693a3bf1ad..c15cf762474 100644 --- a/service/facade/service-parent/pom.xml +++ b/service/facade/service-parent/pom.xml @@ -45,17 +45,17 @@ ${skipTests} - ${env.TF_PLATFORM_TEST_API_KEY} + ${env.TF_PLATFORM_TEST_API_KEY} UTF-8 - v1 + v1 ${project.artifactId} ${project.build.directory}/${project.build.finalName}-runner ${project.groupId} ${project.artifactId}-descriptor - ${timefold.application.version} + ${ai.timefold.model.api-version} ${project.version} ${project.build.directory}/model-descriptor.zip github @@ -428,7 +428,7 @@ ${project.basedir}/src/build/openapi.json - ai.timefold.sdk.model.processing.disabled + ai.timefold.model.processing.disabled !true @@ -578,7 +578,7 @@ timefold-model - ai.timefold.sdk.model.processing.disabled + ai.timefold.model.processing.disabled !true ${maven.home} - ${ai.timefold.platform.model.test.api-key} - + ${ai.timefold.model.test.api-key} + sandbox.timefold.dev 443 true diff --git a/service/maps/service-client/src/main/java/ai/timefold/solver/service/maps/service/client/impl/MapServiceOptionsSupplier.java b/service/maps/service-client/src/main/java/ai/timefold/solver/service/maps/service/client/impl/MapServiceOptionsSupplier.java index 3e69b006996..21b7daae21e 100644 --- a/service/maps/service-client/src/main/java/ai/timefold/solver/service/maps/service/client/impl/MapServiceOptionsSupplier.java +++ b/service/maps/service-client/src/main/java/ai/timefold/solver/service/maps/service/client/impl/MapServiceOptionsSupplier.java @@ -34,9 +34,9 @@ public MapServiceOptionsSupplier( @ConfigProperty(name = "ai.timefold.platform.map-service.location") Optional location, @ConfigProperty( name = "ai.timefold.platform.map-service.max-distance-from-road") Optional maxDistanceFromRoad, - @ConfigProperty(name = "ai.timefold.platform.model") Optional model, - @ConfigProperty(name = "ai.timefold.platform.model-version") Optional modelVersion, - @ConfigProperty(name = "ai.timefold.platform.model-resource") Optional modelResource, + @ConfigProperty(name = "ai.timefold.model.id") Optional model, + @ConfigProperty(name = "ai.timefold.model.api-version") Optional modelVersion, + @ConfigProperty(name = "ai.timefold.model.rest-resource") Optional modelResource, @ConfigProperty(name = "ai.timefold.platform.tenant-id") Optional tenantId, @ConfigProperty(name = "ai.timefold.platform.map-service.transport-type") Optional transportType) { this.provider = provider; diff --git a/service/quarkus/deployment/src/main/java/ai/timefold/solver/service/quarkus/deployment/TimefoldModelDescriptorProcessor.java b/service/quarkus/deployment/src/main/java/ai/timefold/solver/service/quarkus/deployment/TimefoldModelDescriptorProcessor.java index 44f9ecea1c2..5b850a1605e 100644 --- a/service/quarkus/deployment/src/main/java/ai/timefold/solver/service/quarkus/deployment/TimefoldModelDescriptorProcessor.java +++ b/service/quarkus/deployment/src/main/java/ai/timefold/solver/service/quarkus/deployment/TimefoldModelDescriptorProcessor.java @@ -151,35 +151,35 @@ class TimefoldModelDescriptorProcessor { private static final String RESPONSE_CODE_TOO_MANY_REQUESTS = "429"; private static final List CONFIG_PROPERTIES = List.of( - "ai.timefold.platform.termination.spent-limit", - "ai.timefold.platform.termination.maximum-spent-limit", - "ai.timefold.platform.termination.unimproved-spent-limit", - "ai.timefold.platform.termination.maximum-unimproved-spent-limit", + "ai.timefold.model.termination.spent-limit", + "ai.timefold.model.termination.maximum-spent-limit", + "ai.timefold.model.termination.unimproved-spent-limit", + "ai.timefold.model.termination.maximum-unimproved-spent-limit", "ai.timefold.platform.map-service.max-distance-from-road"); - private static final String MODEL_MATURITY_LEVEL_PROPERTY = "timefold.model.maturity-level"; + private static final String MODEL_MATURITY_LEVEL_PROPERTY = "ai.timefold.model.maturity-level"; - private static final String MODEL_FEATURES_PROPERTY = "timefold.model.features"; + private static final String MODEL_FEATURES_PROPERTY = "ai.timefold.model.features"; private static final String MODEL_MAX_THREAD_COUNT_PROPERTY = "ai.timefold.model.max-thread-count"; - private static final String APPLICATION_NAME_PROPERTY = "timefold.application.name"; - private static final String APPLICATION_DESCRIPTION_PROPERTY = "timefold.application.description"; - static final String APPLICATION_VERSION_PROPERTY = "timefold.application.version"; + private static final String APPLICATION_NAME_PROPERTY = "ai.timefold.model.name"; + private static final String APPLICATION_DESCRIPTION_PROPERTY = "ai.timefold.model.description"; + static final String APPLICATION_VERSION_PROPERTY = "ai.timefold.model.api-version"; - private static final String MODEL_TRIAL_DURATION_PROPERTY = "timefold.model.trial.duration"; - private static final String MODEL_TRIAL_MAX_EXTENSIONS_PROPERTY = "timefold.model.trial.max-extensions"; - private static final String MODEL_TRIAL_EXTENSION_DURATION_PROPERTY = "timefold.model.trial.extension-duration"; + private static final String MODEL_TRIAL_DURATION_PROPERTY = "ai.timefold.model.trial.duration"; + private static final String MODEL_TRIAL_MAX_EXTENSIONS_PROPERTY = "ai.timefold.model.trial.max-extensions"; + private static final String MODEL_TRIAL_EXTENSION_DURATION_PROPERTY = "ai.timefold.model.trial.extension-duration"; - private static final String MEMORY_REQUEST_PROPERTY = "timefold.model.resources.memory.request"; - private static final String MEMORY_LIMIT_PROPERTY = "timefold.model.resources.memory.limit"; - private static final String CPU_REQUEST_PROPERTY = "timefold.model.resources.cpu.request"; - private static final String CPU_LIMIT_PROPERTY = "timefold.model.resources.cpu.limit"; + private static final String MEMORY_REQUEST_PROPERTY = "ai.timefold.model.resources.memory.request"; + private static final String MEMORY_LIMIT_PROPERTY = "ai.timefold.model.resources.memory.limit"; + private static final String CPU_REQUEST_PROPERTY = "ai.timefold.model.resources.cpu.request"; + private static final String CPU_LIMIT_PROPERTY = "ai.timefold.model.resources.cpu.limit"; - private static final String DOCUMENTATION_SUPPORT_PROPERTY = "timefold.model.documentation.support"; - private static final String DOCUMENTATION_SOURCE_PROPERTY = "timefold.model.documentation.source"; + private static final String DOCUMENTATION_SUPPORT_PROPERTY = "ai.timefold.model.documentation.support"; + private static final String DOCUMENTATION_SOURCE_PROPERTY = "ai.timefold.model.documentation.source"; - private static final String UI_SUPPORT_PROPERTY = "timefold.model.ui-support"; + private static final String UI_SUPPORT_PROPERTY = "ai.timefold.model.ui-support"; private static final Path APP_JS_SOURCE_PATH = Path.of("src", "main", "resources", "META-INF", "resources"); // To avoid depending on the whole OpenAPI, we use the fully qualified class name. diff --git a/service/quarkus/deployment/src/main/java/ai/timefold/solver/service/quarkus/deployment/config/VisualizationPagesConfig.java b/service/quarkus/deployment/src/main/java/ai/timefold/solver/service/quarkus/deployment/config/VisualizationPagesConfig.java index bdf642491d5..933ab2b23ad 100644 --- a/service/quarkus/deployment/src/main/java/ai/timefold/solver/service/quarkus/deployment/config/VisualizationPagesConfig.java +++ b/service/quarkus/deployment/src/main/java/ai/timefold/solver/service/quarkus/deployment/config/VisualizationPagesConfig.java @@ -6,7 +6,7 @@ import io.quarkus.runtime.annotations.ConfigRoot; import io.smallrye.config.ConfigMapping; -@ConfigMapping(prefix = "timefold.model.visualization") +@ConfigMapping(prefix = "ai.timefold.model.visualization") @ConfigRoot(phase = ConfigPhase.BUILD_TIME) public interface VisualizationPagesConfig { diff --git a/service/quarkus/deployment/src/test/java/ai/timefold/solver/service/quarkus/deployment/ApplicationVersionValidationTest.java b/service/quarkus/deployment/src/test/java/ai/timefold/solver/service/quarkus/deployment/ApplicationVersionValidationTest.java index 6a1486a74b2..c96f3cd37a5 100644 --- a/service/quarkus/deployment/src/test/java/ai/timefold/solver/service/quarkus/deployment/ApplicationVersionValidationTest.java +++ b/service/quarkus/deployment/src/test/java/ai/timefold/solver/service/quarkus/deployment/ApplicationVersionValidationTest.java @@ -17,20 +17,20 @@ void validVersionDoesNotThrow() { void nullVersionThrows() { assertThatThrownBy(() -> validateApplicationVersion(null)) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("timefold.application.version"); + .hasMessageContaining("ai.timefold.model.api-version"); } @Test void emptyVersionThrows() { assertThatThrownBy(() -> validateApplicationVersion("")) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("timefold.application.version"); + .hasMessageContaining("ai.timefold.model.api-version"); } @Test void blankVersionThrows() { assertThatThrownBy(() -> validateApplicationVersion(" ")) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("timefold.application.version"); + .hasMessageContaining("ai.timefold.model.api-version"); } } diff --git a/service/quarkus/deployment/src/test/java/ai/timefold/solver/service/quarkus/deployment/VisualizationPagesConfigTest.java b/service/quarkus/deployment/src/test/java/ai/timefold/solver/service/quarkus/deployment/VisualizationPagesConfigTest.java index db5ee2d4457..8c368731383 100644 --- a/service/quarkus/deployment/src/test/java/ai/timefold/solver/service/quarkus/deployment/VisualizationPagesConfigTest.java +++ b/service/quarkus/deployment/src/test/java/ai/timefold/solver/service/quarkus/deployment/VisualizationPagesConfigTest.java @@ -34,12 +34,12 @@ void noPagesConfigured() { @Test void multiplePagesInOrder() { VisualizationPagesConfig config = buildConfig(Map.of( - "timefold.model.visualization.pages[0].key", "data", - "timefold.model.visualization.pages[0].icon", "TbDatabase", - "timefold.model.visualization.pages[0].label", "Data", - "timefold.model.visualization.pages[1].key", "visualization", - "timefold.model.visualization.pages[1].icon", "TbEye", - "timefold.model.visualization.pages[1].label", "Visualization")); + "ai.timefold.model.visualization.pages[0].key", "data", + "ai.timefold.model.visualization.pages[0].icon", "TbDatabase", + "ai.timefold.model.visualization.pages[0].label", "Data", + "ai.timefold.model.visualization.pages[1].key", "visualization", + "ai.timefold.model.visualization.pages[1].icon", "TbEye", + "ai.timefold.model.visualization.pages[1].label", "Visualization")); assertThat(TimefoldModelDescriptorProcessor.toVisualizationPageDescriptors(config)) .containsExactly( @@ -50,10 +50,10 @@ void multiplePagesInOrder() { @Test void missingFieldFailsToBind() { Map properties = Map.of( - "timefold.model.visualization.pages[0].key", "visualization", - "timefold.model.visualization.pages[0].label", "Visualization"); + "ai.timefold.model.visualization.pages[0].key", "visualization", + "ai.timefold.model.visualization.pages[0].label", "Visualization"); assertThatThrownBy(() -> buildConfig(properties)) - .hasMessageContaining("timefold.model.visualization.pages[0].icon"); + .hasMessageContaining("ai.timefold.model.visualization.pages[0].icon"); } } diff --git a/service/quarkus/integration-tests/src/main/resources/application.properties b/service/quarkus/integration-tests/src/main/resources/application.properties index d96872aed21..c246d53743a 100644 --- a/service/quarkus/integration-tests/src/main/resources/application.properties +++ b/service/quarkus/integration-tests/src/main/resources/application.properties @@ -1,17 +1,17 @@ ######################## # Timefold application info ######################## -timefold.application.name=Timefold SDK - Integration Tests -timefold.application.version=v1 +ai.timefold.model.name=Timefold SDK - Integration Tests +ai.timefold.model.api-version=v1 ######################## # OpenAPI ans swagger ui configuration ######################## quarkus.swagger-ui.always-include=true -quarkus.swagger-ui.title=${timefold.application.name} +quarkus.swagger-ui.title=${ai.timefold.model.name} quarkus.smallrye-openapi.store-schema-directory=target/openapi-schema -mp.openapi.extensions.smallrye.info.title=${timefold.application.name} -mp.openapi.extensions.smallrye.info.version=${timefold.application.version} +mp.openapi.extensions.smallrye.info.title=${ai.timefold.model.name} +mp.openapi.extensions.smallrye.info.version=${ai.timefold.model.api-version} ai.timefold.storage.path=target ai.timefold.storage.ttl=P1D @@ -20,7 +20,7 @@ ai.timefold.model.default-config.resources.memory.mi=256 ai.timefold.model.default-config.resources.cpu.cores=1 ai.timefold.model.default-config.termination.spent-limit=PT30M ai.timefold.model.default-config.termination.unimproved-spent-limit=PT5M -ai.timefold.platform.termination.spent-limit=PT30S +ai.timefold.model.termination.spent-limit=PT30S # Useful for verifying bytecode generated using Gizmo #quarkus.package.jar.decompiler.enabled=true \ No newline at end of file diff --git a/service/quarkus/runtime/src/main/java/ai/timefold/solver/service/quarkus/deployment/rest/schema/ValidatingReaderInterceptorContext.java b/service/quarkus/runtime/src/main/java/ai/timefold/solver/service/quarkus/deployment/rest/schema/ValidatingReaderInterceptorContext.java index ff9c9a648f7..17c4d47365e 100644 --- a/service/quarkus/runtime/src/main/java/ai/timefold/solver/service/quarkus/deployment/rest/schema/ValidatingReaderInterceptorContext.java +++ b/service/quarkus/runtime/src/main/java/ai/timefold/solver/service/quarkus/deployment/rest/schema/ValidatingReaderInterceptorContext.java @@ -60,7 +60,7 @@ public class ValidatingReaderInterceptorContext implements ReaderInterceptor { @Inject public ValidatingReaderInterceptorContext(@All List> validators, ObjectMapper mapper, - @ConfigProperty(name = "ai.timefold.platform.models.validation.enable", defaultValue = "true") boolean enabled) { + @ConfigProperty(name = "ai.timefold.model.schema.validation.enable", defaultValue = "true") boolean enabled) { this.validators = validators; this.mapper = mapper; diff --git a/service/service-defaults/src/main/resources/application.properties b/service/service-defaults/src/main/resources/application.properties index 7c383d8265a..492750b705d 100644 --- a/service/service-defaults/src/main/resources/application.properties +++ b/service/service-defaults/src/main/resources/application.properties @@ -13,40 +13,40 @@ config_ordinal=230 ####################################### # To be overridden by the actual model ####################################### -timefold.application.id=custom-timefold-model -timefold.application.name=Custom Timefold model -timefold.application.description= -timefold.application.build-timestamp= -timefold.application.contact.email= -timefold.application.contact.name= -timefold.application.contact.url= +ai.timefold.model.id=custom-timefold-model +ai.timefold.model.name=Custom Timefold model +ai.timefold.model.description= +ai.timefold.model.build-timestamp= +ai.timefold.model.contact.email= +ai.timefold.model.contact.name= +ai.timefold.model.contact.url= ############################# # Default generic storage configuration ############################# -ai.timefold.storage.bucket=${timefold.application.id} +ai.timefold.storage.bucket=${ai.timefold.model.id} ########################################### # Default solver termination configuration ########################################### -ai.timefold.platform.termination.spent-limit=PT10M +ai.timefold.model.termination.spent-limit=PT10M # disabling the unimproved-spent-limit enables Diminished Returns termination -ai.timefold.platform.termination.unimproved-spent-limit= +ai.timefold.model.termination.unimproved-spent-limit= -%dev.ai.timefold.platform.termination.spent-limit=PT30S -%dev.ai.timefold.platform.termination.unimproved-spent-limit= +%dev.ai.timefold.model.termination.spent-limit=PT30S +%dev.ai.timefold.model.termination.unimproved-spent-limit= ############################# # Default test configuration ############################# %test.quarkus.timefold.solver.environment-mode=FULL_ASSERT -%test.ai.timefold.platform.termination.spent-limit=PT10S -%test.ai.timefold.platform.termination.unimproved-spent-limit=PT1S +%test.ai.timefold.model.termination.spent-limit=PT10S +%test.ai.timefold.model.termination.unimproved-spent-limit=PT1S # Effectively disable termination in favor of the best-score-limit -%test.ai.timefold.platform.termination.best-score-limit=0hard/0medium/*soft +%test.ai.timefold.model.termination.best-score-limit=0hard/0medium/*soft # Some of the tests may use SolverManager directly, declare solver's out-of-the-box variables %test.quarkus.timefold.solver.termination.spent-limit=PT10S @@ -83,7 +83,7 @@ quarkus.log.console.darken=1 ######################## # REST API configuration ######################## -quarkus.rest.path=${timefold.application.version} +quarkus.rest.path=${ai.timefold.model.api-version} # Workaround for https://github.com/quarkusio/quarkus/issues/55362 quarkus.rest.jackson.optimization.enable-reflection-free-serializers=false @@ -92,14 +92,14 @@ quarkus.rest.jackson.optimization.enable-reflection-free-serializers=false # OpenAPI and swagger ui configuration ######################## quarkus.swagger-ui.always-include=true -quarkus.swagger-ui.title=${timefold.application.name} +quarkus.swagger-ui.title=${ai.timefold.model.name} quarkus.smallrye-openapi.store-schema-directory=target/openapi-schema -mp.openapi.extensions.smallrye.info.title=${timefold.application.name} -mp.openapi.extensions.smallrye.info.version=${timefold.application.version} -mp.openapi.extensions.smallrye.info.description=${timefold.application.description} -mp.openapi.extensions.smallrye.info.contact.email=${timefold.application.contact.email} -mp.openapi.extensions.smallrye.info.contact.name=${timefold.application.contact.name} -mp.openapi.extensions.smallrye.info.contact.url=${timefold.application.contact.url} +mp.openapi.extensions.smallrye.info.title=${ai.timefold.model.name} +mp.openapi.extensions.smallrye.info.version=${ai.timefold.model.api-version} +mp.openapi.extensions.smallrye.info.description=${ai.timefold.model.description} +mp.openapi.extensions.smallrye.info.contact.email=${ai.timefold.model.contact.email} +mp.openapi.extensions.smallrye.info.contact.name=${ai.timefold.model.contact.name} +mp.openapi.extensions.smallrye.info.contact.url=${ai.timefold.model.contact.url} mp.openapi.extensions.smallrye.remove-unused-schemas.enable=true ######################## @@ -107,10 +107,10 @@ mp.openapi.extensions.smallrye.remove-unused-schemas.enable=true ######################## image.native-suffix=-native # the end model should also set %container.quarkus.container-image.group -%container.quarkus.container-image.name=model-${timefold.application.id}-${timefold.application.version} +%container.quarkus.container-image.name=model-${ai.timefold.model.id}-${ai.timefold.model.api-version} # the end model should also set %container-native.quarkus.container-image.group -%container-native.quarkus.container-image.name=model-${timefold.application.id}-${timefold.application.version}${image.native-suffix} +%container-native.quarkus.container-image.name=model-${ai.timefold.model.id}-${ai.timefold.model.api-version}${image.native-suffix} ######################################################################## # Default configuration profile settings relevant for the platform only diff --git a/service/test-model/src/main/resources/application.properties b/service/test-model/src/main/resources/application.properties index c8d8b22fd68..2b30b38a9dd 100644 --- a/service/test-model/src/main/resources/application.properties +++ b/service/test-model/src/main/resources/application.properties @@ -1,6 +1,6 @@ ######################## # Timefold application info ######################## -timefold.application.name=Integration Tests - Simplified Employee Shift Scheduling model -timefold.application.id=integration-tests-simplified-employee-shift-scheduling -%test.ai.timefold.platform.termination.best-score-limit=0hard/0medium/*soft \ No newline at end of file +ai.timefold.model.name=Integration Tests - Simplified Employee Shift Scheduling model +ai.timefold.model.id=integration-tests-simplified-employee-shift-scheduling +%test.ai.timefold.model.termination.best-score-limit=0hard/0medium/*soft \ No newline at end of file diff --git a/service/test-model/src/test/java/ai/timefold/solver/model/testmodel/ApiVersion2ConfigProfile.java b/service/test-model/src/test/java/ai/timefold/solver/model/testmodel/ApiVersion2ConfigProfile.java index 5b33a6e7357..99fc13d1108 100644 --- a/service/test-model/src/test/java/ai/timefold/solver/model/testmodel/ApiVersion2ConfigProfile.java +++ b/service/test-model/src/test/java/ai/timefold/solver/model/testmodel/ApiVersion2ConfigProfile.java @@ -12,7 +12,7 @@ public class ApiVersion2ConfigProfile implements QuarkusTestProfile { @Override public Map getConfigOverrides() { - return Map.of("timefold.application.version", "v2-beta"); + return Map.of("ai.timefold.model.api-version", "v2-beta"); } } diff --git a/service/test-model/src/test/java/ai/timefold/solver/model/testmodel/EmployeeScheduleResourceTest.java b/service/test-model/src/test/java/ai/timefold/solver/model/testmodel/EmployeeScheduleResourceTest.java index 26fe5435822..2d15d00d6ea 100644 --- a/service/test-model/src/test/java/ai/timefold/solver/model/testmodel/EmployeeScheduleResourceTest.java +++ b/service/test-model/src/test/java/ai/timefold/solver/model/testmodel/EmployeeScheduleResourceTest.java @@ -92,7 +92,7 @@ public class EmployeeScheduleResourceTest { InMemorySink finalBestSolutionSink; InMemorySink datasetComputedSink; - @ConfigProperty(name = "timefold.application.version") + @ConfigProperty(name = "ai.timefold.model.api-version") String applicationVersion; @TestHTTPResource diff --git a/service/test-model/src/test/java/ai/timefold/solver/model/testmodel/OpenApiTest.java b/service/test-model/src/test/java/ai/timefold/solver/model/testmodel/OpenApiTest.java index 45dd0ad2777..be1b0d094a0 100644 --- a/service/test-model/src/test/java/ai/timefold/solver/model/testmodel/OpenApiTest.java +++ b/service/test-model/src/test/java/ai/timefold/solver/model/testmodel/OpenApiTest.java @@ -27,7 +27,7 @@ @QuarkusTest public class OpenApiTest { - @ConfigProperty(name = "timefold.application.version") + @ConfigProperty(name = "ai.timefold.model.api-version") String applicationVersion; @Test diff --git a/service/test/src/main/java/ai/timefold/solver/service/test/impl/quarkus/ModelRequestSerializationCallback.java b/service/test/src/main/java/ai/timefold/solver/service/test/impl/quarkus/ModelRequestSerializationCallback.java index c6c6cdf83e3..14d1aca1811 100644 --- a/service/test/src/main/java/ai/timefold/solver/service/test/impl/quarkus/ModelRequestSerializationCallback.java +++ b/service/test/src/main/java/ai/timefold/solver/service/test/impl/quarkus/ModelRequestSerializationCallback.java @@ -26,10 +26,10 @@ *
  • Prevents adjusting the time zone offset values to the context time zone when serializing/deserializing.
  • * *

    - * A concrete model can opt-out of this behaviour by setting the system property + * A concrete model can opt-out of this behavior by setting the system property * {@value DISABLE_SERIALIZATION_CALLBACK_PROPERTY_NAME} to true. *

    - * Note: A plain jUnit extension does not work due to classloading issues because Quarkus has to run tests in a custom + * Note: A plain JUnit extension does not work due to classloading issues because Quarkus has to run tests in a custom * classloader which JUnit is not aware of. */ public class ModelRequestSerializationCallback implements QuarkusTestBeforeClassCallback { @@ -37,7 +37,7 @@ public class ModelRequestSerializationCallback implements QuarkusTestBeforeClass public static final Logger LOGGER = LoggerFactory.getLogger(ModelRequestSerializationCallback.class); public static final String DISABLE_SERIALIZATION_CALLBACK_PROPERTY_NAME = - "ai.timefold.platform.model.test.serialization.callback.disable"; + "ai.timefold.model.test.serialization.callback.disable"; private static final ObjectMapper mapper = SdkBuildTimeObjectMapperFactory.create(); diff --git a/service/tools/maven-plugin/README.adoc b/service/tools/maven-plugin/README.adoc index 8e831144b35..68ccc2404c8 100644 --- a/service/tools/maven-plugin/README.adoc +++ b/service/tools/maven-plugin/README.adoc @@ -31,7 +31,7 @@ The plugin uses a goal prefix of `timefold` (see the plugin configuration in the - The request query string includes parameters such as `type`, `registrationKey`, `handleSubscription`, and (for shared type) multiple `restrictedTo` entries for tenants - If the platform responds with 409 (conflict) and `timefold.model.overwrite=true`, the plugin will PATCH `/api/platform/v1/models/{registrationKey}` to update the existing model - The plugin reads the model descriptor to obtain name/id by extracting `timefold-model-descriptor.json` from the archive (or reading `target/timefold/timefold-model-descriptor.json` when present) -- The platform validates the model version (`timefold.application.version`) on registration. It must be a release version `vN` (e.g. `v1`), a git commit hash (1–40 lowercase hex characters), or the literal `SNAPSHOT`; any other value is rejected with HTTP 400. +- The platform validates the model version (`ai.timefold.model.api-version`) on registration. It must be a release version `vN` (e.g. `v1`), a git commit hash (1–40 lowercase hex characters), or the literal `SNAPSHOT`; any other value is rejected with HTTP 400. === Undeploy goal (timefold:undeploy) diff --git a/service/worker/src/main/java/ai/timefold/solver/service/worker/impl/SolverWorker.java b/service/worker/src/main/java/ai/timefold/solver/service/worker/impl/SolverWorker.java index 2b9de5a34ed..c2a32d82724 100644 --- a/service/worker/src/main/java/ai/timefold/solver/service/worker/impl/SolverWorker.java +++ b/service/worker/src/main/java/ai/timefold/solver/service/worker/impl/SolverWorker.java @@ -166,8 +166,8 @@ public class SolverWorker { private BroadcastProcessor> processor = BroadcastProcessor.create(); @Inject - public SolverWorker(@ConfigProperty(name = "timefold.application.name") Optional modelName, - @ConfigProperty(name = "timefold.application.version") Optional modelVersion, + public SolverWorker(@ConfigProperty(name = "ai.timefold.model.name") Optional modelName, + @ConfigProperty(name = "ai.timefold.model.api-version") Optional modelVersion, @ConfigProperty(name = "quarkus.application.version") Optional applicationVersion, AbstractStorageService storageService, ModelValidator modelValidator, diff --git a/service/worker/src/main/java/ai/timefold/solver/service/worker/impl/metrics/PlatformMetricsMeterFilter.java b/service/worker/src/main/java/ai/timefold/solver/service/worker/impl/metrics/PlatformMetricsMeterFilter.java index 4ebfcf1a83e..7f7c630ed4a 100644 --- a/service/worker/src/main/java/ai/timefold/solver/service/worker/impl/metrics/PlatformMetricsMeterFilter.java +++ b/service/worker/src/main/java/ai/timefold/solver/service/worker/impl/metrics/PlatformMetricsMeterFilter.java @@ -26,7 +26,7 @@ public class PlatformMetricsMeterFilter { @Singleton @MeterFilterConstraint(applyTo = PrometheusMeterRegistry.class) public MeterFilter timefoldCommonMetrics( - @ConfigProperty(name = "ai.timefold.platform.model") Optional model, + @ConfigProperty(name = "ai.timefold.model.id") Optional model, @ConfigProperty(name = "ai.timefold.platform.tenant-id") Optional tenantId) { List tags = new ArrayList<>(); diff --git a/service/worker/src/main/java/ai/timefold/solver/service/worker/impl/termination/TerminationConfigParams.java b/service/worker/src/main/java/ai/timefold/solver/service/worker/impl/termination/TerminationConfigParams.java index 9e68d63e6ba..93c3f14dfe4 100644 --- a/service/worker/src/main/java/ai/timefold/solver/service/worker/impl/termination/TerminationConfigParams.java +++ b/service/worker/src/main/java/ai/timefold/solver/service/worker/impl/termination/TerminationConfigParams.java @@ -2,12 +2,12 @@ public class TerminationConfigParams { - public static final String TERMINATION_SPENT_LIMIT = "ai.timefold.platform.termination.spent-limit"; - public static final String TERMINATION_MAXIMUM_SPENT_LIMIT = "ai.timefold.platform.termination.maximum-spent-limit"; - public static final String TERMINATION_UNIMPROVED_SPENT_LIMIT = "ai.timefold.platform.termination.unimproved-spent-limit"; + public static final String TERMINATION_SPENT_LIMIT = "ai.timefold.model.termination.spent-limit"; + public static final String TERMINATION_MAXIMUM_SPENT_LIMIT = "ai.timefold.model.termination.maximum-spent-limit"; + public static final String TERMINATION_UNIMPROVED_SPENT_LIMIT = "ai.timefold.model.termination.unimproved-spent-limit"; public static final String TERMINATION_MAXIMUM_UNIMPROVED_SPENT_LIMIT = - "ai.timefold.platform.termination.maximum-unimproved-spent-limit"; - public static final String TERMINATION_STEP_COUNT_LIMIT = "ai.timefold.platform.termination.step-count-limit"; + "ai.timefold.model.termination.maximum-unimproved-spent-limit"; + public static final String TERMINATION_STEP_COUNT_LIMIT = "ai.timefold.model.termination.step-count-limit"; public static final String TERMINATION_BEST_SCORE_LIMIT = - "ai.timefold.platform.termination.best-score-limit"; + "ai.timefold.model.termination.best-score-limit"; } \ No newline at end of file