diff options
| author | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2022-08-03 14:42:49 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-03 14:42:49 +0200 |
| commit | 2692a032b8ecbe2ddccfb88628cf37af56c3ea36 (patch) | |
| tree | 5dde4331c0a10dd8e843c75cf68d2c7d3cd45906 /opendc-web | |
| parent | b023b085425c0d0f7952c2c331576b8d0fc8c857 (diff) | |
| parent | 87df18bb691260ee69d2e48cf1598e6a4acc329b (diff) | |
merge: Simplify OpenDC deployment process
This pull request attempts to simplify the deployment process necessary for
deploying OpenDC locally or using Docker. There was currently not a clear
and simple way to deploy OpenDC locally, yet the Docker-based deployment
was also out-of-sync.
## Implementation Notes :hammer_and_pick:
* Address several bugs in the OpenDC web runner
* Fix dependency related issues
* Rename `opendc-web-api` to `opendc-web-server`
* Create a local distribution of `opendc-web-server`.
* Fix Docker deployment
* Update deployment guide
## External Dependencies :four_leaf_clover:
* Quarkus 2.11.1
* `jandex-gradle-plugin` 0.13.2
## Breaking API Changes :warning:
* `TraceFormat.installedProviders` has been changed to `TraceFormat.getInstalledProviders`.
The list of installed providers is now not cached at first access, but queried every time the
method is invoked and its results depend on the caller context (e.g., context class loader).
* `OpenDCRunner` now requires a `JobManager` as constructor argument, which can be
constructed as follows: `JobManager.create(client)`
* `opendc-web-api` is now renamed to `opendc-web-server`.
Diffstat (limited to 'opendc-web')
| -rw-r--r-- | opendc-web/opendc-web-api/src/main/resources/init-dev.sql | 3 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java | 30 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java | 32 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java | 6 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner/src/cli/kotlin/org/opendc/web/runner/Main.kt | 3 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/JobManager.kt | 68 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt | 56 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManager.kt | 90 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt | 58 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/WebComputeMonitor.kt | 6 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/Dockerfile (renamed from opendc-web/opendc-web-api/Dockerfile) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/build.gradle.kts (renamed from opendc-web/opendc-web-api/build.gradle.kts) | 9 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/config/application.properties (renamed from opendc-web/opendc-web-api/config/application.properties) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/OpenDCApplication.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/OpenDCApplication.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Job.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Job.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Portfolio.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Portfolio.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Project.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Project.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/ProjectAuthorization.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/ProjectAuthorization.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/ProjectAuthorizationKey.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/ProjectAuthorizationKey.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Scenario.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Scenario.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Topology.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Topology.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Trace.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Trace.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Workload.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Workload.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/JobRepository.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/JobRepository.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/PortfolioRepository.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/PortfolioRepository.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/ProjectRepository.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/ProjectRepository.kt) | 8 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/ScenarioRepository.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/ScenarioRepository.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/TopologyRepository.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/TopologyRepository.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/TraceRepository.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/TraceRepository.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/SchedulerResource.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/SchedulerResource.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/TraceResource.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/TraceResource.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/error/GenericExceptionMapper.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/error/GenericExceptionMapper.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/error/MissingKotlinParameterExceptionMapper.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/runner/JobResource.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/runner/JobResource.kt) | 13 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/PortfolioResource.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/PortfolioResource.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/PortfolioScenarioResource.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/PortfolioScenarioResource.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/ProjectResource.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/ProjectResource.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/ScenarioResource.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/ScenarioResource.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/TopologyResource.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/TopologyResource.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/JobService.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/JobService.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/PortfolioService.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/PortfolioService.kt) | 10 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/ProjectService.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/ProjectService.kt) | 6 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/RunnerConversions.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/RunnerConversions.kt) | 10 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/ScenarioService.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/ScenarioService.kt) | 6 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/TopologyService.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/TopologyService.kt) | 8 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/TraceService.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/TraceService.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/UserConversions.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/UserConversions.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/Utils.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/Utils.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/DevSecurityOverrideFilter.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/DevSecurityOverrideFilter.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/KotlinModuleCustomizer.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/KotlinModuleCustomizer.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/AbstractJsonSqlTypeDescriptor.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/AbstractJsonSqlTypeDescriptor.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonBinarySqlTypeDescriptor.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonBinarySqlTypeDescriptor.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonBytesSqlTypeDescriptor.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonBytesSqlTypeDescriptor.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonSqlTypeDescriptor.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonSqlTypeDescriptor.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonStringSqlTypeDescriptor.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonStringSqlTypeDescriptor.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonType.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonType.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonTypeDescriptor.kt (renamed from opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonTypeDescriptor.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/runner/QuarkusJobManager.kt | 67 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/resources/META-INF/branding/logo.png (renamed from opendc-web/opendc-web-api/src/main/resources/META-INF/branding/logo.png) | bin | 2825 -> 2825 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/resources/application-dev.properties (renamed from opendc-web/opendc-web-api/src/main/resources/application-dev.properties) | 19 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/resources/application-docker.properties | 49 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/resources/application-prod.properties (renamed from opendc-web/opendc-web-api/src/main/resources/application-prod.properties) | 24 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/resources/application-test.properties (renamed from opendc-web/opendc-web-api/src/main/resources/application-test.properties) | 9 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/resources/application.properties (renamed from opendc-web/opendc-web-api/src/main/resources/application.properties) | 22 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/resources/db/migration/V1.0.0__core.sql | 144 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/SchedulerResourceTest.kt (renamed from opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/SchedulerResourceTest.kt) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/TraceResourceTest.kt (renamed from opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/TraceResourceTest.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/runner/JobResourceTest.kt (renamed from opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/runner/JobResourceTest.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/PortfolioResourceTest.kt (renamed from opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/PortfolioResourceTest.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/PortfolioScenarioResourceTest.kt (renamed from opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/PortfolioScenarioResourceTest.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/ProjectResourceTest.kt (renamed from opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/ProjectResourceTest.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/ScenarioResourceTest.kt (renamed from opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/ScenarioResourceTest.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/TopologyResourceTest.kt (renamed from opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/TopologyResourceTest.kt) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-ui/Dockerfile | 12 | ||||
| -rwxr-xr-x | opendc-web/opendc-web-ui/scripts/envsubst.sh | 4 |
76 files changed, 628 insertions, 290 deletions
diff --git a/opendc-web/opendc-web-api/src/main/resources/init-dev.sql b/opendc-web/opendc-web-api/src/main/resources/init-dev.sql deleted file mode 100644 index 756eff46..00000000 --- a/opendc-web/opendc-web-api/src/main/resources/init-dev.sql +++ /dev/null @@ -1,3 +0,0 @@ - --- Add example traces -INSERT INTO traces (id, name, type) VALUES ('bitbrains-small', 'Bitbrains Small', 'vm'); diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts b/opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts index 24f667cf..b3f1ec3b 100644 --- a/opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts +++ b/opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts @@ -29,7 +29,9 @@ plugins { dependencies { implementation(projects.opendcWeb.opendcWebRunnerQuarkus) + implementation(projects.opendcTrace.opendcTraceApi) implementation(platform(libs.quarkus.bom)) implementation(libs.quarkus.core.deployment) + implementation(libs.quarkus.arc.deployment) } diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java b/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java index b9a334ac..94921454 100644 --- a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java +++ b/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java @@ -22,15 +22,23 @@ package org.opendc.web.runner.deployment; +import io.quarkus.arc.deployment.UnremovableBeanBuildItem; import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.annotations.Record; import io.quarkus.deployment.builditem.*; +import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem; +import io.quarkus.deployment.util.ServiceUtil; import io.quarkus.runtime.RuntimeValue; +import org.opendc.trace.spi.TraceFormat; +import org.opendc.web.runner.JobManager; import org.opendc.web.runner.OpenDCRunner; import org.opendc.web.runner.runtime.OpenDCRunnerRecorder; import org.opendc.web.runner.runtime.OpenDCRunnerRuntimeConfig; +import java.io.IOException; +import java.util.Collections; +import java.util.Set; import java.util.function.BooleanSupplier; import static io.quarkus.deployment.annotations.ExecutionTime.RUNTIME_INIT; @@ -51,12 +59,26 @@ public class OpenDCRunnerProcessor { } /** - * Build step to index the necessary dependencies for the OpenDC runner. + * Build step to register the trace formats used by OpenDC. */ @BuildStep - void addDependencies(BuildProducer<IndexDependencyBuildItem> indexDependency) { - indexDependency.produce(new IndexDependencyBuildItem("org.opendc.trace", "opendc-trace-opendc")); - indexDependency.produce(new IndexDependencyBuildItem("org.opendc.trace", "opendc-trace-bitbrains")); + void registerTraceFormats(BuildProducer<ServiceProviderBuildItem> services) throws IOException { + String service = "META-INF/services/" + TraceFormat.class.getName(); + + Set<String> implementations = ServiceUtil.classNamesNamedIn(Thread.currentThread().getContextClassLoader(), + service); + + services.produce( + new ServiceProviderBuildItem(TraceFormat.class.getName(), + implementations.toArray(new String[0]))); + } + + /** + * Mark {@link JobManager} as unremoveable, since we look up this service dynamically in {@link OpenDCRunnerRecorder}. + */ + @BuildStep + UnremovableBeanBuildItem unremovableBeans() { + return UnremovableBeanBuildItem.beanTypes(JobManager.class); } /** diff --git a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java b/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java index b243dbc3..f5c056ef 100644 --- a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java +++ b/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java @@ -26,11 +26,11 @@ import io.quarkus.runtime.RuntimeValue; import io.quarkus.runtime.ShutdownContext; import io.quarkus.runtime.annotations.Recorder; import org.jboss.logging.Logger; -import org.opendc.web.client.runner.OpenDCRunnerClient; +import org.opendc.web.runner.JobManager; import org.opendc.web.runner.OpenDCRunner; +import javax.enterprise.inject.spi.CDI; import java.io.File; -import java.net.URI; /** * Helper class for starting the OpenDC web runner. @@ -43,12 +43,18 @@ public class OpenDCRunnerRecorder { * Helper method to create an {@link OpenDCRunner} instance. */ public RuntimeValue<OpenDCRunner> createRunner(OpenDCRunnerRuntimeConfig config) { - URI apiUrl = URI.create(config.apiUrl); - OpenDCRunnerClient client = new OpenDCRunnerClient(apiUrl, null); + int parallelism = config.parallelism; + if (parallelism < 0) { + throw new IllegalArgumentException("Parallelism must be non-negative"); + } else if (parallelism == 0) { + parallelism = Math.min(1, Runtime.getRuntime().availableProcessors() - 1); + } + + JobManager manager = CDI.current().select(JobManager.class).get(); OpenDCRunner runner = new OpenDCRunner( - client, + manager, new File(config.tracePath), - config.parallelism, + parallelism, config.jobTimeout, config.pollInterval, config.heartbeatInterval @@ -64,18 +70,10 @@ public class OpenDCRunnerRecorder { OpenDCRunnerRuntimeConfig config, ShutdownContext shutdownContext) { if (config.enable) { - LOGGER.info("Starting OpenDC Runner in background (polling " + config.apiUrl + ")"); - - Thread thread = new Thread(() -> { - try { - // Wait for some time to allow Vert.x to bind to the local port - Thread.sleep(1000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } + LOGGER.info("Starting OpenDC Runner in background (polling every " + config.pollInterval + ")"); - runner.getValue().run(); - }); + Thread thread = new Thread(runner.getValue()); + thread.setName("opendc-runner"); thread.start(); shutdownContext.addShutdownTask(thread::interrupt); diff --git a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java b/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java index e1dbf0a8..e9258f06 100644 --- a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java +++ b/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java @@ -40,12 +40,6 @@ public class OpenDCRunnerRuntimeConfig { public boolean enable; /** - * The URI to the (local) API to communicate with. - */ - @ConfigItem(defaultValue = "http://${quarkus.http.host}:${quarkus.http.port}${quarkus.resteasy.path:}") - public String apiUrl; - - /** * The path where the workload traces are located. */ @ConfigItem(defaultValue = "traces") diff --git a/opendc-web/opendc-web-runner/src/cli/kotlin/org/opendc/web/runner/Main.kt b/opendc-web/opendc-web-runner/src/cli/kotlin/org/opendc/web/runner/Main.kt index 348a838c..4cfbdd7c 100644 --- a/opendc-web/opendc-web-runner/src/cli/kotlin/org/opendc/web/runner/Main.kt +++ b/opendc-web/opendc-web-runner/src/cli/kotlin/org/opendc/web/runner/Main.kt @@ -114,7 +114,8 @@ class RunnerCli : CliktCommand(name = "opendc-runner") { logger.info { "Starting OpenDC web runner" } val client = OpenDCRunnerClient(baseUrl = apiUrl, OpenIdAuthController(authDomain, authClientId, authClientSecret, authAudience)) - val runner = OpenDCRunner(client, tracePath, parallelism = parallelism) + val manager = JobManager(client) + val runner = OpenDCRunner(manager, tracePath, parallelism = parallelism) logger.info { "Watching for queued scenarios" } runner.run() diff --git a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/JobManager.kt b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/JobManager.kt new file mode 100644 index 00000000..50aa03d8 --- /dev/null +++ b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/JobManager.kt @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2022 AtLarge Research + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.opendc.web.runner + +import org.opendc.web.client.runner.OpenDCRunnerClient +import org.opendc.web.proto.runner.Job +import org.opendc.web.runner.internal.JobManagerImpl + +/** + * Interface used by the [OpenDCRunner] to manage the available jobs to be processed. + */ +public interface JobManager { + /** + * Find the next job that the simulator needs to process. + */ + public fun findNext(): Job? + + /** + * Claim the simulation job with the specified id. + */ + public fun claim(id: Long): Boolean + + /** + * Update the heartbeat of the specified job. + */ + public fun heartbeat(id: Long) + + /** + * Mark the job as failed. + */ + public fun fail(id: Long) + + /** + * Persist the specified results for the specified job. + */ + public fun finish(id: Long, results: Map<String, Any>) + + public companion object { + /** + * Create a [JobManager] given the specified [client]. + */ + @JvmStatic + @JvmName("create") + public operator fun invoke(client: OpenDCRunnerClient): JobManager { + return JobManagerImpl(client) + } + } +} diff --git a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt index 9c9a866d..c958bdb2 100644 --- a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt +++ b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/OpenDCRunner.kt @@ -36,27 +36,26 @@ import org.opendc.simulator.compute.model.ProcessingUnit import org.opendc.simulator.compute.power.LinearPowerModel import org.opendc.simulator.compute.power.SimplePowerDriver import org.opendc.simulator.core.runBlockingSimulation -import org.opendc.web.client.runner.OpenDCRunnerClient import org.opendc.web.proto.runner.Job import org.opendc.web.proto.runner.Scenario -import org.opendc.web.runner.internal.JobManager import org.opendc.web.runner.internal.WebComputeMonitor import java.io.File import java.time.Duration import java.util.* import java.util.concurrent.* +import java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory /** * Class to execute the pending jobs via the OpenDC web API. * - * @param client The [OpenDCRunnerClient] to connect to the OpenDC web API. + * @param manager The underlying [JobManager] to manage the available jobs. * @param tracePath The directory where the traces are located. * @param jobTimeout The maximum duration of a simulation job. * @param pollInterval The interval to poll the API with. * @param heartbeatInterval The interval to send a heartbeat to the API server. */ public class OpenDCRunner( - client: OpenDCRunnerClient, + private val manager: JobManager, private val tracePath: File, parallelism: Int = Runtime.getRuntime().availableProcessors(), private val jobTimeout: Duration = Duration.ofMillis(10), @@ -69,11 +68,6 @@ public class OpenDCRunner( private val logger = KotlinLogging.logger {} /** - * Helper class to manage the available jobs. - */ - private val manager = JobManager(client) - - /** * Helper class to load the workloads. */ private val workloadLoader = ComputeWorkloadLoader(tracePath) @@ -81,7 +75,7 @@ public class OpenDCRunner( /** * The [ForkJoinPool] that is used to execute the simulation jobs. */ - private val pool = ForkJoinPool(parallelism) + private val pool = ForkJoinPool(parallelism, RunnerThreadFactory(Thread.currentThread().contextClassLoader), null, false) /** * A [ScheduledExecutorService] to manage the heartbeat of simulation jobs as well as tracking the deadline of @@ -97,11 +91,6 @@ public class OpenDCRunner( override fun run() { try { while (true) { - // Check if anyone has interrupted the thread - if (Thread.interrupted()) { - throw InterruptedException() - } - val job = manager.findNext() if (job == null) { Thread.sleep(pollInterval.toMillis()) @@ -119,6 +108,8 @@ public class OpenDCRunner( pool.submit(JobAction(job)) } + } catch (_: InterruptedException) { + // Gracefully exit when the thread is interrupted } finally { workloadLoader.reset() @@ -144,12 +135,32 @@ public class OpenDCRunner( try { val topology = convertTopology(scenario.topology) val jobs = (0 until scenario.portfolio.targets.repeats).map { repeat -> SimulationTask(scenario, repeat, topology) } - val results = invokeAll(jobs) + val results = invokeAll(jobs).map { it.rawResult } logger.info { "Finished simulation for job $id" } heartbeat.cancel(true) - manager.finish(id, results.map { it.rawResult }) + + manager.finish( + id, + mapOf( + "total_requested_burst" to results.map { it.totalActiveTime + it.totalIdleTime }, + "total_granted_burst" to results.map { it.totalActiveTime }, + "total_overcommitted_burst" to results.map { it.totalStealTime }, + "total_interfered_burst" to results.map { it.totalLostTime }, + "mean_cpu_usage" to results.map { it.meanCpuUsage }, + "mean_cpu_demand" to results.map { it.meanCpuDemand }, + "mean_num_deployed_images" to results.map { it.meanNumDeployedImages }, + "max_num_deployed_images" to results.map { it.maxNumDeployedImages }, + "total_power_draw" to results.map { it.totalPowerDraw }, + "total_failure_slices" to results.map { it.totalFailureSlices }, + "total_failure_vm_slices" to results.map { it.totalFailureVmSlices }, + "total_vms_submitted" to results.map { it.totalVmsSubmitted }, + "total_vms_queued" to results.map { it.totalVmsQueued }, + "total_vms_finished" to results.map { it.totalVmsFinished }, + "total_vms_failed" to results.map { it.totalVmsFailed } + ) + ) } catch (e: Exception) { // Check whether the job failed due to exceeding its time budget if (Thread.interrupted()) { @@ -303,4 +314,15 @@ public class OpenDCRunner( override fun toString(): String = "WebRunnerTopologyFactory" } } + + /** + * A custom [ForkJoinWorkerThreadFactory] that uses the [ClassLoader] of specified by the runner. + */ + private class RunnerThreadFactory(private val classLoader: ClassLoader) : ForkJoinWorkerThreadFactory { + override fun newThread(pool: ForkJoinPool): ForkJoinWorkerThread = object : ForkJoinWorkerThread(pool) { + init { + contextClassLoader = classLoader + } + } + } } diff --git a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManager.kt b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManager.kt deleted file mode 100644 index 99b8aaf1..00000000 --- a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManager.kt +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2022 AtLarge Research - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package org.opendc.web.runner.internal - -import org.opendc.web.client.runner.OpenDCRunnerClient -import org.opendc.web.proto.JobState -import org.opendc.web.proto.runner.Job - -/** - * Helper class to manage the queue of jobs that need to be simulated. - */ -internal class JobManager(private val client: OpenDCRunnerClient) { - /** - * Find the next job that the simulator needs to process. - */ - fun findNext(): Job? { - return client.jobs.queryPending().firstOrNull() - } - - /** - * Claim the simulation job with the specified id. - */ - fun claim(id: Long): Boolean { - client.jobs.update(id, Job.Update(JobState.CLAIMED)) // TODO Handle conflict - return true - } - - /** - * Update the heartbeat of the specified scenario. - */ - fun heartbeat(id: Long) { - client.jobs.update(id, Job.Update(JobState.RUNNING)) - } - - /** - * Mark the scenario as failed. - */ - fun fail(id: Long) { - client.jobs.update(id, Job.Update(JobState.FAILED)) - } - - /** - * Persist the specified results. - */ - fun finish(id: Long, results: List<WebComputeMonitor.Results>) { - client.jobs.update( - id, - Job.Update( - JobState.FINISHED, - mapOf( - "total_requested_burst" to results.map { it.totalActiveTime + it.totalIdleTime }, - "total_granted_burst" to results.map { it.totalActiveTime }, - "total_overcommitted_burst" to results.map { it.totalStealTime }, - "total_interfered_burst" to results.map { it.totalLostTime }, - "mean_cpu_usage" to results.map { it.meanCpuUsage }, - "mean_cpu_demand" to results.map { it.meanCpuDemand }, - "mean_num_deployed_images" to results.map { it.meanNumDeployedImages }, - "max_num_deployed_images" to results.map { it.maxNumDeployedImages }, - "total_power_draw" to results.map { it.totalPowerDraw }, - "total_failure_slices" to results.map { it.totalFailureSlices }, - "total_failure_vm_slices" to results.map { it.totalFailureVmSlices }, - "total_vms_submitted" to results.map { it.totalVmsSubmitted }, - "total_vms_queued" to results.map { it.totalVmsQueued }, - "total_vms_finished" to results.map { it.totalVmsFinished }, - "total_vms_failed" to results.map { it.totalVmsFailed } - ) - ) - ) - } -} diff --git a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt new file mode 100644 index 00000000..39a6851c --- /dev/null +++ b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2022 AtLarge Research + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.opendc.web.runner.internal + +import org.opendc.web.client.runner.OpenDCRunnerClient +import org.opendc.web.proto.JobState +import org.opendc.web.proto.runner.Job +import org.opendc.web.runner.JobManager + +/** + * Default implementation of [JobManager] that uses the OpenDC client to receive jobs. + */ +internal class JobManagerImpl(private val client: OpenDCRunnerClient) : JobManager { + override fun findNext(): Job? { + return client.jobs.queryPending().firstOrNull() + } + + override fun claim(id: Long): Boolean { + return try { + client.jobs.update(id, Job.Update(JobState.CLAIMED)) + true + } catch (e: IllegalStateException) { + false + } + } + + override fun heartbeat(id: Long) { + client.jobs.update(id, Job.Update(JobState.RUNNING)) + } + + override fun fail(id: Long) { + client.jobs.update(id, Job.Update(JobState.FAILED)) + } + + override fun finish(id: Long, results: Map<String, Any>) { + client.jobs.update(id, Job.Update(JobState.FINISHED, results)) + } +} diff --git a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/WebComputeMonitor.kt b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/WebComputeMonitor.kt index 01002c70..4c3d1cfa 100644 --- a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/WebComputeMonitor.kt +++ b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/WebComputeMonitor.kt @@ -105,9 +105,9 @@ internal class WebComputeMonitor : ComputeMonitor { hostAggregateMetrics.totalIdleTime, hostAggregateMetrics.totalStealTime, hostAggregateMetrics.totalLostTime, - hostMetrics.map { it.value.cpuUsage / it.value.count }.average(), - hostMetrics.map { it.value.cpuDemand / it.value.count }.average(), - hostMetrics.map { it.value.instanceCount.toDouble() / it.value.count }.average(), + hostMetrics.map { it.value.cpuUsage / it.value.count }.average().let { if (it.isNaN()) 0.0 else it }, + hostMetrics.map { it.value.cpuDemand / it.value.count }.average().let { if (it.isNaN()) 0.0 else it }, + hostMetrics.map { it.value.instanceCount.toDouble() / it.value.count }.average().let { if (it.isNaN()) 0.0 else it }, hostMetrics.map { it.value.instanceCount.toDouble() / it.value.count }.maxOrNull() ?: 0.0, hostAggregateMetrics.totalPowerDraw, hostAggregateMetrics.totalFailureSlices.roundToLong(), diff --git a/opendc-web/opendc-web-api/Dockerfile b/opendc-web/opendc-web-server/Dockerfile index ff300170..444d787e 100644 --- a/opendc-web/opendc-web-api/Dockerfile +++ b/opendc-web/opendc-web-server/Dockerfile @@ -9,9 +9,9 @@ RUN ./gradlew --version # Build project COPY ./ /app/ -RUN ./gradlew --no-daemon :opendc-web:opendc-web-api:build +RUN ./gradlew --no-daemon :opendc-web:opendc-web-server:quarkusBuild -Dquarkus.profile=docker FROM openjdk:17-slim -COPY --from=0 /app/opendc-web/opendc-web-api/build/quarkus-app /opt/opendc +COPY --from=0 /app/opendc-web/opendc-web-server/build/quarkus-app /opt/opendc WORKDIR /opt/opendc CMD java -jar quarkus-run.jar diff --git a/opendc-web/opendc-web-api/build.gradle.kts b/opendc-web/opendc-web-server/build.gradle.kts index 89b8273c..a55df2f7 100644 --- a/opendc-web/opendc-web-api/build.gradle.kts +++ b/opendc-web/opendc-web-server/build.gradle.kts @@ -20,7 +20,7 @@ * SOFTWARE. */ -description = "REST API for the OpenDC website" +description = "Web server of OpenDC" /* Build configuration */ plugins { @@ -48,8 +48,9 @@ dependencies { implementation(libs.quarkus.hibernate.orm) implementation(libs.quarkus.hibernate.validator) + implementation(libs.quarkus.flyway) implementation(libs.quarkus.jdbc.postgresql) - quarkusDev(libs.quarkus.jdbc.h2) + implementation(libs.quarkus.jdbc.h2) testImplementation(libs.quarkus.junit5.core) testImplementation(libs.quarkus.junit5.mockk) @@ -68,8 +69,8 @@ val createStartScripts by tasks.creating(CreateStartScripts::class) { } distributions { - create("server") { - distributionBaseName.set("opendc-server") + main { + distributionBaseName.set("opendc") contents { from("../../LICENSE.txt") diff --git a/opendc-web/opendc-web-api/config/application.properties b/opendc-web/opendc-web-server/config/application.properties index 30eaaef9..30eaaef9 100644 --- a/opendc-web/opendc-web-api/config/application.properties +++ b/opendc-web/opendc-web-server/config/application.properties diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/OpenDCApplication.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/OpenDCApplication.kt index ddbd5390..1a426095 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/OpenDCApplication.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/OpenDCApplication.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api +package org.opendc.web.server import javax.ws.rs.core.Application diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Job.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Job.kt index b09b46a1..024e7b89 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Job.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Job.kt @@ -20,12 +20,12 @@ * SOFTWARE. */ -package org.opendc.web.api.model +package org.opendc.web.server.model import org.hibernate.annotations.Type import org.hibernate.annotations.TypeDef -import org.opendc.web.api.util.hibernate.json.JsonType import org.opendc.web.proto.JobState +import org.opendc.web.server.util.hibernate.json.JsonType import java.time.Instant import javax.persistence.* diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Portfolio.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Portfolio.kt index c8b94daf..3e3f76a0 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Portfolio.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Portfolio.kt @@ -20,12 +20,12 @@ * SOFTWARE. */ -package org.opendc.web.api.model +package org.opendc.web.server.model import org.hibernate.annotations.Type import org.hibernate.annotations.TypeDef -import org.opendc.web.api.util.hibernate.json.JsonType import org.opendc.web.proto.Targets +import org.opendc.web.server.util.hibernate.json.JsonType import javax.persistence.* /** diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Project.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Project.kt index e0440bf4..aa98b677 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Project.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Project.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.model +package org.opendc.web.server.model import java.time.Instant import javax.persistence.* diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/ProjectAuthorization.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/ProjectAuthorization.kt index a72ff06a..a353186e 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/ProjectAuthorization.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/ProjectAuthorization.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.model +package org.opendc.web.server.model import org.opendc.web.proto.user.ProjectRole import javax.persistence.* diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/ProjectAuthorizationKey.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/ProjectAuthorizationKey.kt index b5f66e70..449b6608 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/ProjectAuthorizationKey.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/ProjectAuthorizationKey.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.model +package org.opendc.web.server.model import javax.persistence.Column import javax.persistence.Embeddable diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Scenario.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Scenario.kt index 5c9cb259..e40cff47 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Scenario.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Scenario.kt @@ -20,12 +20,12 @@ * SOFTWARE. */ -package org.opendc.web.api.model +package org.opendc.web.server.model import org.hibernate.annotations.Type import org.hibernate.annotations.TypeDef -import org.opendc.web.api.util.hibernate.json.JsonType import org.opendc.web.proto.OperationalPhenomena +import org.opendc.web.server.util.hibernate.json.JsonType import javax.persistence.* /** diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Topology.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Topology.kt index 9b64e382..a190b1ee 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Topology.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Topology.kt @@ -20,12 +20,12 @@ * SOFTWARE. */ -package org.opendc.web.api.model +package org.opendc.web.server.model import org.hibernate.annotations.Type import org.hibernate.annotations.TypeDef -import org.opendc.web.api.util.hibernate.json.JsonType import org.opendc.web.proto.Room +import org.opendc.web.server.util.hibernate.json.JsonType import java.time.Instant import javax.persistence.* diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Trace.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Trace.kt index 2e2d71f8..8aaac613 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Trace.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Trace.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.model +package org.opendc.web.server.model import javax.persistence.* diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Workload.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Workload.kt index 07fc096b..9c59dc25 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/model/Workload.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/model/Workload.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.model +package org.opendc.web.server.model import javax.persistence.Column import javax.persistence.Embeddable diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/JobRepository.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/JobRepository.kt index 558d7c38..5fee07a3 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/JobRepository.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/JobRepository.kt @@ -20,10 +20,10 @@ * SOFTWARE. */ -package org.opendc.web.api.repository +package org.opendc.web.server.repository -import org.opendc.web.api.model.Job import org.opendc.web.proto.JobState +import org.opendc.web.server.model.Job import java.time.Instant import javax.enterprise.context.ApplicationScoped import javax.inject.Inject diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/PortfolioRepository.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/PortfolioRepository.kt index 34b3598c..77130c15 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/PortfolioRepository.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/PortfolioRepository.kt @@ -20,9 +20,9 @@ * SOFTWARE. */ -package org.opendc.web.api.repository +package org.opendc.web.server.repository -import org.opendc.web.api.model.Portfolio +import org.opendc.web.server.model.Portfolio import javax.enterprise.context.ApplicationScoped import javax.inject.Inject import javax.persistence.EntityManager diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/ProjectRepository.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/ProjectRepository.kt index 6529f778..519da3de 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/ProjectRepository.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/ProjectRepository.kt @@ -20,11 +20,11 @@ * SOFTWARE. */ -package org.opendc.web.api.repository +package org.opendc.web.server.repository -import org.opendc.web.api.model.Project -import org.opendc.web.api.model.ProjectAuthorization -import org.opendc.web.api.model.ProjectAuthorizationKey +import org.opendc.web.server.model.Project +import org.opendc.web.server.model.ProjectAuthorization +import org.opendc.web.server.model.ProjectAuthorizationKey import java.time.Instant import javax.enterprise.context.ApplicationScoped import javax.inject.Inject diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/ScenarioRepository.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/ScenarioRepository.kt index de116ad6..145db71d 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/ScenarioRepository.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/ScenarioRepository.kt @@ -20,9 +20,9 @@ * SOFTWARE. */ -package org.opendc.web.api.repository +package org.opendc.web.server.repository -import org.opendc.web.api.model.Scenario +import org.opendc.web.server.model.Scenario import javax.enterprise.context.ApplicationScoped import javax.inject.Inject import javax.persistence.EntityManager diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/TopologyRepository.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/TopologyRepository.kt index cd8f666e..e8eadd63 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/TopologyRepository.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/TopologyRepository.kt @@ -20,9 +20,9 @@ * SOFTWARE. */ -package org.opendc.web.api.repository +package org.opendc.web.server.repository -import org.opendc.web.api.model.Topology +import org.opendc.web.server.model.Topology import javax.enterprise.context.ApplicationScoped import javax.inject.Inject import javax.persistence.EntityManager diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/TraceRepository.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/TraceRepository.kt index 6652fc80..f328eea6 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/repository/TraceRepository.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/repository/TraceRepository.kt @@ -20,9 +20,9 @@ * SOFTWARE. */ -package org.opendc.web.api.repository +package org.opendc.web.server.repository -import org.opendc.web.api.model.Trace +import org.opendc.web.server.model.Trace import javax.enterprise.context.ApplicationScoped import javax.inject.Inject import javax.persistence.EntityManager diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/SchedulerResource.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/SchedulerResource.kt index 735fdd9b..919b25fc 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/SchedulerResource.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/SchedulerResource.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.rest +package org.opendc.web.server.rest import javax.ws.rs.GET import javax.ws.rs.Path diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/TraceResource.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/TraceResource.kt index e87fe602..f46f7f91 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/TraceResource.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/TraceResource.kt @@ -20,10 +20,10 @@ * SOFTWARE. */ -package org.opendc.web.api.rest +package org.opendc.web.server.rest -import org.opendc.web.api.service.TraceService import org.opendc.web.proto.Trace +import org.opendc.web.server.service.TraceService import javax.inject.Inject import javax.ws.rs.* diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/error/GenericExceptionMapper.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/error/GenericExceptionMapper.kt index fb253758..d8df72e0 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/error/GenericExceptionMapper.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/error/GenericExceptionMapper.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.error +package org.opendc.web.server.rest.error import org.opendc.web.proto.ProtocolError import javax.ws.rs.WebApplicationException diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/error/MissingKotlinParameterExceptionMapper.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.kt index 57cd35d1..e50917aa 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/error/MissingKotlinParameterExceptionMapper.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.error +package org.opendc.web.server.rest.error import com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException import org.opendc.web.proto.ProtocolError diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/runner/JobResource.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/runner/JobResource.kt index 7e31e2c5..351a2237 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/runner/JobResource.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/runner/JobResource.kt @@ -20,10 +20,10 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.runner +package org.opendc.web.server.rest.runner -import org.opendc.web.api.service.JobService import org.opendc.web.proto.runner.Job +import org.opendc.web.server.service.JobService import javax.annotation.security.RolesAllowed import javax.inject.Inject import javax.transaction.Transactional @@ -60,6 +60,13 @@ class JobResource @Inject constructor(private val jobService: JobService) { @Path("{job}") @Transactional fun update(@PathParam("job") id: Long, @Valid update: Job.Update): Job { - return jobService.updateState(id, update.state, update.results) ?: throw WebApplicationException("Job not found", 404) + return try { + jobService.updateState(id, update.state, update.results) + ?: throw WebApplicationException("Job not found", 404) + } catch (e: IllegalArgumentException) { + throw WebApplicationException(e, 400) + } catch (e: IllegalStateException) { + throw WebApplicationException(e, 409) + } } } diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/PortfolioResource.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/PortfolioResource.kt index e720de75..352dd491 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/PortfolioResource.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/PortfolioResource.kt @@ -20,11 +20,11 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.user +package org.opendc.web.server.rest.user import io.quarkus.security.identity.SecurityIdentity -import org.opendc.web.api.service.PortfolioService import org.opendc.web.proto.user.Portfolio +import org.opendc.web.server.service.PortfolioService import javax.annotation.security.RolesAllowed import javax.inject.Inject import javax.transaction.Transactional diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/PortfolioScenarioResource.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/PortfolioScenarioResource.kt index 8d24b2eb..f2372bde 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/PortfolioScenarioResource.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/PortfolioScenarioResource.kt @@ -20,11 +20,11 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.user +package org.opendc.web.server.rest.user import io.quarkus.security.identity.SecurityIdentity -import org.opendc.web.api.service.ScenarioService import org.opendc.web.proto.user.Scenario +import org.opendc.web.server.service.ScenarioService import javax.annotation.security.RolesAllowed import javax.inject.Inject import javax.transaction.Transactional diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/ProjectResource.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/ProjectResource.kt index a27d50e7..f3d96f55 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/ProjectResource.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/ProjectResource.kt @@ -20,11 +20,11 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.user +package org.opendc.web.server.rest.user import io.quarkus.security.identity.SecurityIdentity -import org.opendc.web.api.service.ProjectService import org.opendc.web.proto.user.Project +import org.opendc.web.server.service.ProjectService import javax.annotation.security.RolesAllowed import javax.inject.Inject import javax.transaction.Transactional diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/ScenarioResource.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/ScenarioResource.kt index 3690f987..24cdcb6a 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/ScenarioResource.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/ScenarioResource.kt @@ -20,11 +20,11 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.user +package org.opendc.web.server.rest.user import io.quarkus.security.identity.SecurityIdentity -import org.opendc.web.api.service.ScenarioService import org.opendc.web.proto.user.Scenario +import org.opendc.web.server.service.ScenarioService import javax.annotation.security.RolesAllowed import javax.inject.Inject import javax.transaction.Transactional diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/TopologyResource.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/TopologyResource.kt index 52c5eaaa..40b3741c 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/rest/user/TopologyResource.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/rest/user/TopologyResource.kt @@ -20,11 +20,11 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.user +package org.opendc.web.server.rest.user import io.quarkus.security.identity.SecurityIdentity -import org.opendc.web.api.service.TopologyService import org.opendc.web.proto.user.Topology +import org.opendc.web.server.service.TopologyService import javax.annotation.security.RolesAllowed import javax.inject.Inject import javax.transaction.Transactional diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/JobService.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/JobService.kt index 1b33248d..6b49e8b6 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/JobService.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/JobService.kt @@ -20,11 +20,11 @@ * SOFTWARE. */ -package org.opendc.web.api.service +package org.opendc.web.server.service -import org.opendc.web.api.repository.JobRepository import org.opendc.web.proto.JobState import org.opendc.web.proto.runner.Job +import org.opendc.web.server.repository.JobRepository import java.time.Instant import javax.enterprise.context.ApplicationScoped import javax.inject.Inject diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/PortfolioService.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/PortfolioService.kt index 1f41c2d7..0d380190 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/PortfolioService.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/PortfolioService.kt @@ -20,16 +20,16 @@ * SOFTWARE. */ -package org.opendc.web.api.service +package org.opendc.web.server.service -import org.opendc.web.api.model.* -import org.opendc.web.api.repository.PortfolioRepository -import org.opendc.web.api.repository.ProjectRepository import org.opendc.web.proto.user.Portfolio +import org.opendc.web.server.model.* +import org.opendc.web.server.repository.PortfolioRepository +import org.opendc.web.server.repository.ProjectRepository import java.time.Instant import javax.enterprise.context.ApplicationScoped import javax.inject.Inject -import org.opendc.web.api.model.Portfolio as PortfolioEntity +import org.opendc.web.server.model.Portfolio as PortfolioEntity /** * Service for managing [Portfolio]s. diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/ProjectService.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/ProjectService.kt index c3e43395..44348195 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/ProjectService.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/ProjectService.kt @@ -20,12 +20,12 @@ * SOFTWARE. */ -package org.opendc.web.api.service +package org.opendc.web.server.service -import org.opendc.web.api.model.* -import org.opendc.web.api.repository.ProjectRepository import org.opendc.web.proto.user.Project import org.opendc.web.proto.user.ProjectRole +import org.opendc.web.server.model.* +import org.opendc.web.server.repository.ProjectRepository import java.time.Instant import javax.enterprise.context.ApplicationScoped import javax.inject.Inject diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/RunnerConversions.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/RunnerConversions.kt index 3722a641..1dcc95ee 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/RunnerConversions.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/RunnerConversions.kt @@ -20,12 +20,12 @@ * SOFTWARE. */ -package org.opendc.web.api.service +package org.opendc.web.server.service -import org.opendc.web.api.model.Job -import org.opendc.web.api.model.Portfolio -import org.opendc.web.api.model.Scenario -import org.opendc.web.api.model.Topology +import org.opendc.web.server.model.Job +import org.opendc.web.server.model.Portfolio +import org.opendc.web.server.model.Scenario +import org.opendc.web.server.model.Topology /** * Conversions into DTOs provided to OpenDC runners. diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/ScenarioService.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/ScenarioService.kt index dd51a929..5b56068d 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/ScenarioService.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/ScenarioService.kt @@ -20,11 +20,11 @@ * SOFTWARE. */ -package org.opendc.web.api.service +package org.opendc.web.server.service -import org.opendc.web.api.model.* -import org.opendc.web.api.repository.* import org.opendc.web.proto.user.Scenario +import org.opendc.web.server.model.* +import org.opendc.web.server.repository.* import java.time.Instant import javax.enterprise.context.ApplicationScoped import javax.inject.Inject diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/TopologyService.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/TopologyService.kt index f3460496..5c2a457a 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/TopologyService.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/TopologyService.kt @@ -20,15 +20,15 @@ * SOFTWARE. */ -package org.opendc.web.api.service +package org.opendc.web.server.service -import org.opendc.web.api.repository.ProjectRepository -import org.opendc.web.api.repository.TopologyRepository import org.opendc.web.proto.user.Topology +import org.opendc.web.server.repository.ProjectRepository +import org.opendc.web.server.repository.TopologyRepository import java.time.Instant import javax.enterprise.context.ApplicationScoped import javax.inject.Inject -import org.opendc.web.api.model.Topology as TopologyEntity +import org.opendc.web.server.model.Topology as TopologyEntity /** * Service for managing [Topology]s. diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/TraceService.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/TraceService.kt index a942696e..bd14950c 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/TraceService.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/TraceService.kt @@ -20,10 +20,10 @@ * SOFTWARE. */ -package org.opendc.web.api.service +package org.opendc.web.server.service -import org.opendc.web.api.repository.TraceRepository import org.opendc.web.proto.Trace +import org.opendc.web.server.repository.TraceRepository import javax.enterprise.context.ApplicationScoped import javax.inject.Inject diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/UserConversions.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/UserConversions.kt index 8612ee8c..ee78d103 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/UserConversions.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/UserConversions.kt @@ -20,10 +20,10 @@ * SOFTWARE. */ -package org.opendc.web.api.service +package org.opendc.web.server.service -import org.opendc.web.api.model.* import org.opendc.web.proto.user.Project +import org.opendc.web.server.model.* /** * Conversions into DTOs provided to users. diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/Utils.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/Utils.kt index 254be8b7..2d0da3b3 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/service/Utils.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/service/Utils.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.service +package org.opendc.web.server.service import org.opendc.web.proto.user.ProjectRole diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/DevSecurityOverrideFilter.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/DevSecurityOverrideFilter.kt index ba2cf2ae..0bdf959a 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/DevSecurityOverrideFilter.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/DevSecurityOverrideFilter.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.util +package org.opendc.web.server.util import io.quarkus.arc.properties.IfBuildProperty import java.security.Principal diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/KotlinModuleCustomizer.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/KotlinModuleCustomizer.kt index 8d91a00c..8634c8a4 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/KotlinModuleCustomizer.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/KotlinModuleCustomizer.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.util +package org.opendc.web.server.util import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.KotlinModule diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/AbstractJsonSqlTypeDescriptor.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/AbstractJsonSqlTypeDescriptor.kt index 134739c9..9e29b734 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/AbstractJsonSqlTypeDescriptor.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/AbstractJsonSqlTypeDescriptor.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.util.hibernate.json +package org.opendc.web.server.util.hibernate.json import org.hibernate.type.descriptor.ValueExtractor import org.hibernate.type.descriptor.WrapperOptions diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonBinarySqlTypeDescriptor.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonBinarySqlTypeDescriptor.kt index 32f69928..45752d4e 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonBinarySqlTypeDescriptor.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonBinarySqlTypeDescriptor.kt @@ -1,4 +1,4 @@ -package org.opendc.web.api.util.hibernate.json +package org.opendc.web.server.util.hibernate.json import com.fasterxml.jackson.databind.JsonNode import org.hibernate.type.descriptor.ValueBinder diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonBytesSqlTypeDescriptor.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonBytesSqlTypeDescriptor.kt index eaecc5b0..216c465f 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonBytesSqlTypeDescriptor.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonBytesSqlTypeDescriptor.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.util.hibernate.json +package org.opendc.web.server.util.hibernate.json import org.hibernate.type.descriptor.ValueBinder import org.hibernate.type.descriptor.WrapperOptions diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonSqlTypeDescriptor.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonSqlTypeDescriptor.kt index e005f368..f5069c4c 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonSqlTypeDescriptor.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonSqlTypeDescriptor.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.util.hibernate.json +package org.opendc.web.server.util.hibernate.json import org.hibernate.dialect.H2Dialect import org.hibernate.dialect.PostgreSQL81Dialect diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonStringSqlTypeDescriptor.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonStringSqlTypeDescriptor.kt index cf400c95..3d10cb0e 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonStringSqlTypeDescriptor.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonStringSqlTypeDescriptor.kt @@ -1,4 +1,4 @@ -package org.opendc.web.api.util.hibernate.json +package org.opendc.web.server.util.hibernate.json import org.hibernate.type.descriptor.ValueBinder import org.hibernate.type.descriptor.WrapperOptions diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonType.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonType.kt index 2206e82f..98663640 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonType.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonType.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.util.hibernate.json +package org.opendc.web.server.util.hibernate.json import com.fasterxml.jackson.databind.ObjectMapper import org.hibernate.type.AbstractSingleColumnStandardBasicType diff --git a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonTypeDescriptor.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonTypeDescriptor.kt index 3386582e..6c6078dd 100644 --- a/opendc-web/opendc-web-api/src/main/kotlin/org/opendc/web/api/util/hibernate/json/JsonTypeDescriptor.kt +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/hibernate/json/JsonTypeDescriptor.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.util.hibernate.json +package org.opendc.web.server.util.hibernate.json import com.fasterxml.jackson.databind.ObjectMapper import org.hibernate.HibernateException diff --git a/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/runner/QuarkusJobManager.kt b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/runner/QuarkusJobManager.kt new file mode 100644 index 00000000..4704c5ae --- /dev/null +++ b/opendc-web/opendc-web-server/src/main/kotlin/org/opendc/web/server/util/runner/QuarkusJobManager.kt @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2022 AtLarge Research + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.opendc.web.server.util.runner + +import org.opendc.web.proto.JobState +import org.opendc.web.proto.runner.Job +import org.opendc.web.runner.JobManager +import org.opendc.web.server.service.JobService +import javax.enterprise.context.ApplicationScoped +import javax.inject.Inject +import javax.transaction.Transactional + +/** + * Implementation of [JobManager] that interfaces directly with [JobService] without overhead of the REST API. + */ +@ApplicationScoped +class QuarkusJobManager @Inject constructor(private val service: JobService) : JobManager { + @Transactional + override fun findNext(): Job? { + return service.queryPending().firstOrNull() + } + + @Transactional + override fun claim(id: Long): Boolean { + return try { + service.updateState(id, JobState.CLAIMED, null) + true + } catch (e: IllegalStateException) { + false + } + } + + @Transactional + override fun heartbeat(id: Long) { + service.updateState(id, JobState.RUNNING, null) + } + + @Transactional + override fun fail(id: Long) { + service.updateState(id, JobState.FAILED, null) + } + + @Transactional + override fun finish(id: Long, results: Map<String, Any>) { + service.updateState(id, JobState.FINISHED, results) + } +} diff --git a/opendc-web/opendc-web-api/src/main/resources/META-INF/branding/logo.png b/opendc-web/opendc-web-server/src/main/resources/META-INF/branding/logo.png Binary files differindex d743038b..d743038b 100644 --- a/opendc-web/opendc-web-api/src/main/resources/META-INF/branding/logo.png +++ b/opendc-web/opendc-web-server/src/main/resources/META-INF/branding/logo.png diff --git a/opendc-web/opendc-web-api/src/main/resources/application-dev.properties b/opendc-web/opendc-web-server/src/main/resources/application-dev.properties index 08d11609..4065f55f 100644 --- a/opendc-web/opendc-web-api/src/main/resources/application-dev.properties +++ b/opendc-web/opendc-web-server/src/main/resources/application-dev.properties @@ -19,22 +19,19 @@ # SOFTWARE. # Datasource (H2) -quarkus.datasource.db-kind = h2 -quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;INIT=CREATE TYPE IF NOT EXISTS "JSONB" AS blob; +quarkus.datasource.db-kind=h2 +quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;INIT=CREATE TYPE IF NOT EXISTS "JSONB" AS json; # Hibernate quarkus.hibernate-orm.dialect=org.hibernate.dialect.H2Dialect -quarkus.hibernate-orm.database.generation=drop-and-create -quarkus.hibernate-orm.sql-load-script=init-dev.sql +quarkus.flyway.clean-at-start=true -# OpenID -quarkus.oidc.enabled=false -quarkus.oidc.auth-server-url= -quarkus.oidc.client-id= +# Disable authentication +opendc.security.enabled=false -# OpenDC web UI +# Mount web UI at root and API at "/api" quarkus.opendc-ui.path=/ quarkus.resteasy.path=/api -opendc.security.enabled=false - +# Swagger UI +quarkus.smallrye-openapi.servers=http://localhost:8080 diff --git a/opendc-web/opendc-web-server/src/main/resources/application-docker.properties b/opendc-web/opendc-web-server/src/main/resources/application-docker.properties new file mode 100644 index 00000000..eae9ee1e --- /dev/null +++ b/opendc-web/opendc-web-server/src/main/resources/application-docker.properties @@ -0,0 +1,49 @@ +# Copyright (c) 2022 AtLarge Research +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# Configuration for standalone Docker server distribution without web UI. + +# Datasource +quarkus.datasource.db-kind=postgresql +quarkus.datasource.username=${OPENDC_DB_USERNAME} +quarkus.datasource.password=${OPENDC_DB_PASSWORD} +quarkus.datasource.jdbc.url=${OPENDC_DB_URL} + +# Hibernate +quarkus.hibernate-orm.dialect=org.hibernate.dialect.PostgreSQL95Dialect + +# Disable OpenDC web UI +quarkus.opendc-ui.include=false + +# Security +opendc.security.enabled=true +quarkus.oidc.auth-server-url=https://${OPENDC_AUTH0_DOMAIN} +quarkus.oidc.client-id=${OPENDC_AUTH0_AUDIENCE} +quarkus.oidc.token.audience=${quarkus.oidc.client-id} +quarkus.oidc.roles.role-claim-path=scope + +# Swagger UI +quarkus.swagger-ui.oauth-client-id=${OPENDC_AUTH0_DOCS_CLIENT_ID:} +quarkus.swagger-ui.oauth-additional-query-string-params={"audience":"${OPENDC_AUTH0_AUDIENCE:https://api.opendc.org/v2/}"} + +quarkus.smallrye-openapi.security-scheme=oidc +quarkus.smallrye-openapi.security-scheme-name=Auth0 +quarkus.smallrye-openapi.oidc-open-id-connect-url=https://${OPENDC_AUTH0_DOMAIN:opendc.eu.auth0.com}/.well-known/openid-configuration +quarkus.smallrye-openapi.servers=https://api.opendc.org diff --git a/opendc-web/opendc-web-api/src/main/resources/application-prod.properties b/opendc-web/opendc-web-server/src/main/resources/application-prod.properties index cebcdaab..8e6a9720 100644 --- a/opendc-web/opendc-web-api/src/main/resources/application-prod.properties +++ b/opendc-web/opendc-web-server/src/main/resources/application-prod.properties @@ -18,16 +18,20 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -# Datasource -quarkus.datasource.db-kind=postgresql -quarkus.datasource.username=${OPENDC_DB_USERNAME} -quarkus.datasource.password=${OPENDC_DB_PASSWORD} -quarkus.datasource.jdbc.url=${OPENDC_DB_URL} +# Datasource (H2) +quarkus.datasource.db-kind=h2 +quarkus.datasource.jdbc.url=jdbc:h2:file:./data/opendc;DB_CLOSE_DELAY=-1;INIT=CREATE TYPE IF NOT EXISTS "JSONB" AS json; # Hibernate -quarkus.hibernate-orm.dialect=org.hibernate.dialect.PostgreSQL95Dialect -quarkus.hibernate-orm.database.generation=validate +quarkus.hibernate-orm.dialect=org.hibernate.dialect.H2Dialect -# Disable OpenDC web UI and runner -quarkus.opendc-ui.include=false -quarkus.opendc-runner.include=false +# Disable authentication +opendc.security.enabled=false +quarkus.oidc.enabled=${opendc.security.enabled} + +# Mount web UI at root and API at "/api" +quarkus.opendc-ui.path=/ +quarkus.resteasy.path=/api + +# Swagger UI +quarkus.smallrye-openapi.servers=http://localhost:8080 diff --git a/opendc-web/opendc-web-api/src/main/resources/application-test.properties b/opendc-web/opendc-web-server/src/main/resources/application-test.properties index 10197119..338a00b9 100644 --- a/opendc-web/opendc-web-api/src/main/resources/application-test.properties +++ b/opendc-web/opendc-web-server/src/main/resources/application-test.properties @@ -20,20 +20,17 @@ # Datasource configuration quarkus.datasource.db-kind = h2 -quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;INIT=CREATE TYPE "JSONB" AS blob; +quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;INIT=CREATE TYPE IF NOT EXISTS "JSONB" AS json; quarkus.hibernate-orm.dialect=org.hibernate.dialect.H2Dialect -quarkus.hibernate-orm.database.generation=drop-and-create +quarkus.flyway.clean-at-start=true -# No OIDC for tests +# Disable security quarkus.oidc.enabled=false -quarkus.oidc.auth-server-url= -quarkus.oidc.client-id= # Disable OpenAPI/Swagger quarkus.smallrye-openapi.enable=false quarkus.swagger-ui.enable=false -quarkus.smallrye-openapi.oidc-open-id-connect-url= # Disable OpenDC web UI and runner quarkus.opendc-ui.include=false diff --git a/opendc-web/opendc-web-api/src/main/resources/application.properties b/opendc-web/opendc-web-server/src/main/resources/application.properties index fa134e7e..40933304 100644 --- a/opendc-web/opendc-web-api/src/main/resources/application.properties +++ b/opendc-web/opendc-web-server/src/main/resources/application.properties @@ -18,13 +18,16 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +# Enable CORS quarkus.http.cors=true -# OpenID -quarkus.oidc.auth-server-url=https://${OPENDC_AUTH0_DOMAIN} -quarkus.oidc.client-id=${OPENDC_AUTH0_AUDIENCE} -quarkus.oidc.token.audience=${quarkus.oidc.client-id} -quarkus.oidc.roles.role-claim-path=scope +# Security +quarkus.oidc.enabled=${opendc.security.enabled} + +# Runner logging +quarkus.log.category."org.opendc".level=ERROR +quarkus.log.category."org.opendc.web".level=INFO +quarkus.log.category."org.apache".level=WARN # OpenAPI and Swagger quarkus.smallrye-openapi.info-title=OpenDC REST API @@ -39,10 +42,7 @@ quarkus.smallrye-openapi.info-license-url=https://github.com/atlarge-research/op quarkus.swagger-ui.path=docs quarkus.swagger-ui.always-include=true -quarkus.swagger-ui.oauth-client-id=${OPENDC_AUTH0_DOCS_CLIENT_ID:} -quarkus.swagger-ui.oauth-additional-query-string-params={"audience":"${OPENDC_AUTH0_AUDIENCE:https://api.opendc.org/}"} -quarkus.smallrye-openapi.security-scheme=oidc -quarkus.smallrye-openapi.security-scheme-name=Auth0 -quarkus.smallrye-openapi.oidc-open-id-connect-url=https://${OPENDC_AUTH0_DOMAIN:opendc.eu.auth0.com}/.well-known/openid-configuration -quarkus.smallrye-openapi.servers=http://localhost:8080 +# Flyway database migrations +quarkus.flyway.baseline-on-migrate=true +quarkus.flyway.migrate-at-start=true diff --git a/opendc-web/opendc-web-server/src/main/resources/db/migration/V1.0.0__core.sql b/opendc-web/opendc-web-server/src/main/resources/db/migration/V1.0.0__core.sql new file mode 100644 index 00000000..183a70ea --- /dev/null +++ b/opendc-web/opendc-web-server/src/main/resources/db/migration/V1.0.0__core.sql @@ -0,0 +1,144 @@ +-- Hibernate sequence for unique identifiers +create sequence hibernate_sequence start with 1 increment by 1; + +-- Projects +create table projects +( + id bigint not null, + created_at timestamp not null, + name varchar(255) not null, + portfolios_created integer not null, + scenarios_created integer not null, + topologies_created integer not null, + updated_at timestamp not null, + primary key (id) +); + +-- Project authorizations authorize users specific permissions to a project. +create table project_authorizations +( + project_id bigint not null, + user_id varchar(255) not null, + role integer not null, + primary key (project_id, user_id) +); + +-- Topologies represent the datacenter designs created by users. +create table topologies +( + id bigint not null, + created_at timestamp not null, + name varchar(255) not null, + number integer not null, + rooms jsonb not null, + updated_at timestamp not null, + project_id bigint not null, + primary key (id) +); + +-- Portfolios +create table portfolios +( + id bigint not null, + name varchar(255) not null, + number integer not null, + targets jsonb not null, + project_id bigint not null, + primary key (id) +); + +create table scenarios +( + id bigint not null, + name varchar(255) not null, + number integer not null, + phenomena jsonb not null, + scheduler_name varchar(255) not null, + sampling_fraction double precision not null, + job_id bigint, + portfolio_id bigint not null, + project_id bigint not null, + topology_id bigint not null, + trace_id varchar(255) not null, + primary key (id) +); + +create table jobs +( + id bigint not null, + created_at timestamp not null, + repeats integer not null, + results jsonb, + state integer not null, + updated_at timestamp not null, + primary key (id) +); + +-- Workload traces available to the user. +create table traces +( + id varchar(255) not null, + name varchar(255) not null, + type varchar(255) not null, + primary key (id) +); + +-- Relations +alter table project_authorizations + add constraint FK824hw0npe6gwiamwb6vohsu19 + foreign key (project_id) + references projects; + +create index fn_topologies_number on topologies (project_id, number); + +alter table topologies + add constraint UK2s5na63qtu2of4g7odocmwi2a unique (project_id, number); + +alter table topologies + add constraint FK1kpw87pylq7m2ct9lq0ed1u3b + foreign key (project_id) + references projects; + +create index fn_portfolios_number on portfolios (project_id, number); + +alter table portfolios + add constraint FK31ytuaxb7aboxueng9hq7owwa + foreign key (project_id) + references projects; + +alter table portfolios + add constraint UK56dtskxruwj22dvxny2hfhks1 unique (project_id, number); + +create index fn_scenarios_number on scenarios (project_id, number); + +alter table scenarios + add constraint UKd0bk6fmtw5qiu9ty7t3g9crqd unique (project_id, number); + +alter table scenarios + add constraint FK9utvg0i5uu8db9pa17a1d77iy + foreign key (job_id) + references jobs; + +alter table scenarios + add constraint FK181y5hv0uibhj7fpbpkdy90s5 + foreign key (portfolio_id) + references portfolios; + +alter table scenarios + add constraint FKbvwyh4joavs444rj270o3b8fr + foreign key (project_id) + references projects; + +alter table scenarios + add constraint FKrk6ltvaf9lp0aukp9dq3qjujj + foreign key (topology_id) + references topologies; + +alter table scenarios + add constraint FK5m05tqeekqjkbbsaj3ehl6o8n + foreign key (trace_id) + references traces; + +-- Initial data +insert into traces (id, name, type) +values ('bitbrains-small', 'Bitbrains Small', 'vm'); diff --git a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/SchedulerResourceTest.kt b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/SchedulerResourceTest.kt index e88e1c1c..c1460db9 100644 --- a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/SchedulerResourceTest.kt +++ b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/SchedulerResourceTest.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.rest +package org.opendc.web.server.rest import io.quarkus.test.junit.QuarkusTest import io.restassured.http.ContentType diff --git a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/TraceResourceTest.kt b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/TraceResourceTest.kt index 6fab9953..2490cf46 100644 --- a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/TraceResourceTest.kt +++ b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/TraceResourceTest.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.rest +package org.opendc.web.server.rest import io.mockk.every import io.quarkiverse.test.junit.mockk.InjectMock @@ -34,8 +34,8 @@ import org.hamcrest.Matchers import org.hamcrest.Matchers.equalTo import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -import org.opendc.web.api.service.TraceService import org.opendc.web.proto.Trace +import org.opendc.web.server.service.TraceService /** * Test suite for [TraceResource]. diff --git a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/runner/JobResourceTest.kt b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/runner/JobResourceTest.kt index b82c60e8..c96788b0 100644 --- a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/runner/JobResourceTest.kt +++ b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/runner/JobResourceTest.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.runner +package org.opendc.web.server.rest.runner import io.mockk.every import io.quarkiverse.test.junit.mockk.InjectMock @@ -35,13 +35,13 @@ import io.restassured.module.kotlin.extensions.When import org.hamcrest.Matchers.equalTo import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -import org.opendc.web.api.service.JobService import org.opendc.web.proto.* import org.opendc.web.proto.Targets import org.opendc.web.proto.runner.Job import org.opendc.web.proto.runner.Portfolio import org.opendc.web.proto.runner.Scenario import org.opendc.web.proto.runner.Topology +import org.opendc.web.server.service.JobService import java.time.Instant /** diff --git a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/PortfolioResourceTest.kt b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/PortfolioResourceTest.kt index f74efbca..5798d2e7 100644 --- a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/PortfolioResourceTest.kt +++ b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/PortfolioResourceTest.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.user +package org.opendc.web.server.rest.user import io.mockk.every import io.quarkiverse.test.junit.mockk.InjectMock @@ -35,11 +35,11 @@ import io.restassured.module.kotlin.extensions.When import org.hamcrest.Matchers import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -import org.opendc.web.api.service.PortfolioService import org.opendc.web.proto.Targets import org.opendc.web.proto.user.Portfolio import org.opendc.web.proto.user.Project import org.opendc.web.proto.user.ProjectRole +import org.opendc.web.server.service.PortfolioService import java.time.Instant /** diff --git a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/PortfolioScenarioResourceTest.kt b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/PortfolioScenarioResourceTest.kt index dbafa8c0..13c47d19 100644 --- a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/PortfolioScenarioResourceTest.kt +++ b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/PortfolioScenarioResourceTest.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.user +package org.opendc.web.server.rest.user import io.mockk.every import io.quarkiverse.test.junit.mockk.InjectMock @@ -35,9 +35,9 @@ import io.restassured.module.kotlin.extensions.When import org.hamcrest.Matchers import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -import org.opendc.web.api.service.ScenarioService import org.opendc.web.proto.* import org.opendc.web.proto.user.* +import org.opendc.web.server.service.ScenarioService import java.time.Instant /** diff --git a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/ProjectResourceTest.kt b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/ProjectResourceTest.kt index bcbcbab1..fec8759c 100644 --- a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/ProjectResourceTest.kt +++ b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/ProjectResourceTest.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.user +package org.opendc.web.server.rest.user import io.mockk.every import io.quarkiverse.test.junit.mockk.InjectMock @@ -35,9 +35,9 @@ import io.restassured.module.kotlin.extensions.When import org.hamcrest.Matchers.equalTo import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -import org.opendc.web.api.service.ProjectService import org.opendc.web.proto.user.Project import org.opendc.web.proto.user.ProjectRole +import org.opendc.web.server.service.ProjectService import java.time.Instant /** diff --git a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/ScenarioResourceTest.kt b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/ScenarioResourceTest.kt index 65e6e9a1..1d63679e 100644 --- a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/ScenarioResourceTest.kt +++ b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/ScenarioResourceTest.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.user +package org.opendc.web.server.rest.user import io.mockk.every import io.quarkiverse.test.junit.mockk.InjectMock @@ -35,9 +35,9 @@ import io.restassured.module.kotlin.extensions.When import org.hamcrest.Matchers import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -import org.opendc.web.api.service.ScenarioService import org.opendc.web.proto.* import org.opendc.web.proto.user.* +import org.opendc.web.server.service.ScenarioService import java.time.Instant /** diff --git a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/TopologyResourceTest.kt b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/TopologyResourceTest.kt index ececeaca..8a542d33 100644 --- a/opendc-web/opendc-web-api/src/test/kotlin/org/opendc/web/api/rest/user/TopologyResourceTest.kt +++ b/opendc-web/opendc-web-server/src/test/kotlin/org/opendc/web/server/rest/user/TopologyResourceTest.kt @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.api.rest.user +package org.opendc.web.server.rest.user import io.mockk.every import io.quarkiverse.test.junit.mockk.InjectMock @@ -35,10 +35,10 @@ import io.restassured.module.kotlin.extensions.When import org.hamcrest.Matchers import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -import org.opendc.web.api.service.TopologyService import org.opendc.web.proto.user.Project import org.opendc.web.proto.user.ProjectRole import org.opendc.web.proto.user.Topology +import org.opendc.web.server.service.TopologyService import java.time.Instant /** diff --git a/opendc-web/opendc-web-ui/Dockerfile b/opendc-web/opendc-web-ui/Dockerfile index 15a92068..5ff85092 100644 --- a/opendc-web/opendc-web-ui/Dockerfile +++ b/opendc-web/opendc-web-ui/Dockerfile @@ -2,8 +2,8 @@ FROM node:16 AS staging MAINTAINER OpenDC Maintainers <opendc@atlarge-research.com> # Copy package details -COPY ./package.json ./yarn.lock /opendc/ -RUN cd /opendc && yarn install --frozen-lockfile +COPY ./package.json ./package-lock.json /opendc/ +RUN cd /opendc && npm ci # Build frontend FROM node:16 AS build @@ -17,12 +17,12 @@ RUN cd /opendc/ \ NEXT_PUBLIC_AUTH0_DOMAIN="%%NEXT_PUBLIC_AUTH0_DOMAIN%%" \ NEXT_PUBLIC_AUTH0_CLIENT_ID="%%NEXT_PUBLIC_AUTH0_CLIENT_ID%%" \ NEXT_PUBLIC_AUTH0_AUDIENCE="%%NEXT_PUBLIC_AUTH0_AUDIENCE%%" \ - && yarn build \ - && yarn cache clean --all \ - && mv .next .next.template + && npm run build \ + && npm cache clean --force \ + && mv build/next build/next.template FROM node:16-slim COPY --from=build /opendc /opendc WORKDIR /opendc -CMD ./scripts/envsubst.sh; yarn start +CMD ./scripts/envsubst.sh; npm run start diff --git a/opendc-web/opendc-web-ui/scripts/envsubst.sh b/opendc-web/opendc-web-ui/scripts/envsubst.sh index d7ae9ecb..afc976ed 100755 --- a/opendc-web/opendc-web-ui/scripts/envsubst.sh +++ b/opendc-web/opendc-web-ui/scripts/envsubst.sh @@ -3,8 +3,8 @@ set -e auto_envsubst() { - input_path="/opendc/.next.template" - output_path="/opendc/.next" + input_path="build/next.template" + output_path="build/next" cp -r "$input_path" "$output_path" find "$output_path" -type f -name '*.js' -exec perl -pi -e 's/%%(NEXT_PUBLIC_[_A-Z0-9]+)%%/$ENV{$1}/g' {} \; |
