summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTING.md0
-rw-r--r--README.md81
-rw-r--r--build.gradle.kts15
-rw-r--r--buildSrc/build.gradle.kts (renamed from odcsim-testkit/build.gradle.kts)21
-rw-r--r--buildSrc/settings.gradle.kts (renamed from opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/MachineStatus.kt)10
-rw-r--r--buildSrc/src/main/kotlin/dokka-convention.gradle.kts (renamed from opendc-core/src/main/kotlin/com/atlarge/opendc/model/User.kt)16
-rw-r--r--buildSrc/src/main/kotlin/jacoco-aggregation.gradle.kts (renamed from opendc-format/build.gradle.kts)33
-rw-r--r--buildSrc/src/main/kotlin/kotlin-library-convention.gradle.kts (renamed from opendc-experiments-tpds/build.gradle.kts)33
-rw-r--r--buildSrc/src/main/kotlin/library.kt (renamed from opendc-core/src/main/kotlin/com/atlarge/opendc/model/Identity.kt)22
-rw-r--r--gradle/dokka.gradle47
-rw-r--r--gradle/jacoco.gradle55
-rw-r--r--gradle/kotlin.gradle64
-rw-r--r--gradle/wrapper/gradle-wrapper.properties2
-rw-r--r--odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/BehaviorTestKit.kt138
-rw-r--r--odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/TestInbox.kt90
-rw-r--r--odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/ActorContextStub.kt99
-rw-r--r--odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/ActorSystemStub.kt58
-rw-r--r--odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/BehaviorTestKitImpl.kt112
-rw-r--r--odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/TestInboxImpl.kt100
-rw-r--r--odcsim/README.md100
-rw-r--r--odcsim/build.gradle.kts (renamed from opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/ProcessingElement.kt)10
-rw-r--r--odcsim/odcsim-core/build.gradle.kts (renamed from odcsim-core/build.gradle.kts)19
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorContext.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorContext.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorPath.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorPath.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorRef.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorRef.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorSystem.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorSystem.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorSystemFactory.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorSystemFactory.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Behavior.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/Behavior.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Behaviors.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/Behaviors.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Envelope.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/Envelope.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Signals.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/Signals.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/StashBuffer.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/StashBuffer.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Time.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/Time.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/TimerScheduler.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/TimerScheduler.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/Behavior.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/Behavior.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/dsl/Receive.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/dsl/Receive.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/dsl/Timeout.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/dsl/Timeout.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/ActorContext.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/ActorContext.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/Behavior.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/Behavior.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/BehaviorInterpreter.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/BehaviorInterpreter.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/Coroutines.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/Coroutines.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/StashBufferImpl.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/StashBufferImpl.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/TimerSchedulerImpl.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/TimerSchedulerImpl.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LocationAwareLoggerImpl.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LocationAwareLoggerImpl.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LocationIgnorantLoggerImpl.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LocationIgnorantLoggerImpl.kt)0
-rw-r--r--odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LoggerImpl.kt (renamed from odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LoggerImpl.kt)0
-rw-r--r--odcsim/odcsim-core/src/test/kotlin/com/atlarge/odcsim/ActorPathTest.kt (renamed from odcsim-core/src/test/kotlin/com/atlarge/odcsim/ActorPathTest.kt)0
-rw-r--r--odcsim/odcsim-core/src/test/kotlin/com/atlarge/odcsim/BehaviorTest.kt (renamed from odcsim-core/src/test/kotlin/com/atlarge/odcsim/BehaviorTest.kt)0
-rw-r--r--odcsim/odcsim-core/src/test/kotlin/com/atlarge/odcsim/CoroutinesTest.kt (renamed from odcsim-core/src/test/kotlin/com/atlarge/odcsim/CoroutinesTest.kt)0
-rw-r--r--odcsim/odcsim-engine-omega/build.gradle.kts (renamed from odcsim-engine-omega/build.gradle.kts)18
-rw-r--r--odcsim/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt (renamed from odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt)0
-rw-r--r--odcsim/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactory.kt (renamed from odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactory.kt)0
-rw-r--r--odcsim/odcsim-engine-omega/src/main/resources/META-INF/services/com.atlarge.odcsim.ActorSystemFactory (renamed from odcsim-engine-omega/src/main/resources/META-INF/services/com.atlarge.odcsim.ActorSystemFactory)0
-rw-r--r--odcsim/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactoryTest.kt (renamed from odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactoryTest.kt)0
-rw-r--r--odcsim/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemTest.kt (renamed from odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemTest.kt)0
-rw-r--r--odcsim/odcsim-engine-tests/build.gradle.kts (renamed from odcsim-engine-tests/build.gradle.kts)9
-rw-r--r--odcsim/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemContract.kt (renamed from odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemContract.kt)0
-rw-r--r--odcsim/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemFactoryContract.kt (renamed from odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemFactoryContract.kt)0
-rw-r--r--opendc-core/build.gradle.kts51
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/Broker.kt40
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/Cluster.kt56
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/Environment.kt36
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/Model.kt71
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/Platform.kt103
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/Zone.kt212
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/Machine.kt105
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/ProcessingUnit.kt44
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/host/Host.kt86
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/MachineScheduler.kt48
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/MachineSchedulerLogic.kt64
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/ProcessObserver.kt68
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/ProcessState.kt50
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/ProcessView.kt53
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/SpaceSharedMachineScheduler.kt178
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/supervision/MachineSupervisionEvent.kt49
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/supervision/MachineSupervisor.kt67
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/Service.kt47
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/ServiceMap.kt49
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/ServiceProvider.kt64
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/provisioning/ProvisioningService.kt77
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/provisioning/SimpleProvisioningService.kt125
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/resources/HostView.kt42
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/resources/ResourceManagementService.kt121
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/Workload.kt39
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/Application.kt47
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/FlopsApplication.kt164
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/Process.kt91
-rw-r--r--opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/ProcessSupervisor.kt79
-rw-r--r--opendc-core/src/test/kotlin/com/atlarge/opendc/model/workload/application/FlopsApplicationTest.kt128
-rw-r--r--opendc-experiments-tpds/src/main/kotlin/com/atlarge/opendc/experiments/tpds/TestExperiment.kt148
-rw-r--r--opendc-experiments-tpds/src/main/resources/env/setup-test.json36
-rw-r--r--opendc-experiments-tpds/src/main/resources/log4j2.xml52
-rw-r--r--opendc-format-gwf/build.gradle.kts48
-rw-r--r--opendc-format-gwf/src/main/kotlin/com/atlarge/opendc/format/trace/gwf/GwfTraceReader.kt168
-rw-r--r--opendc-format-gwf/src/test/kotlin/com/atlarge/opendc/format/trace/gwf/GwfTraceReaderTest.kt41
-rw-r--r--opendc-format-gwf/src/test/resources/trace.gwf4
-rw-r--r--opendc-format-sc18/build.gradle.kts50
-rw-r--r--opendc-format-sc18/src/main/kotlin/com/atlarge/opendc/format/environment/sc18/Model.kt44
-rw-r--r--opendc-format-sc18/src/main/kotlin/com/atlarge/opendc/format/environment/sc18/Sc18EnvironmentReader.kt95
-rw-r--r--opendc-format/src/main/kotlin/com/atlarge/opendc/format/environment/EnvironmentReader.kt38
-rw-r--r--opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/TraceEntry.kt55
-rw-r--r--opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/TraceReader.kt37
-rw-r--r--opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/TraceWriter.kt46
-rw-r--r--opendc-workflows/build.gradle.kts51
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/StageWorkflowScheduler.kt58
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/StageWorkflowSchedulerLogic.kt248
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowScheduler.kt47
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowSchedulerLogic.kt55
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowSchedulerMode.kt42
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowService.kt193
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/FifoJobSortingPolicy.kt37
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/JobAdmissionPolicy.kt48
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/JobSortingPolicy.kt44
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/NullJobAdmissionPolicy.kt40
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/RandomJobSortingPolicy.kt40
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/FirstFitResourceSelectionPolicy.kt40
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/FunctionalResourceDynamicFilterPolicy.kt43
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/ResourceDynamicFilterPolicy.kt49
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/ResourceSelectionPolicy.kt48
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/FifoTaskSortingPolicy.kt37
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/FunctionalTaskEligibilityPolicy.kt38
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/RandomTaskSortingPolicy.kt40
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/TaskEligibilityPolicy.kt48
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/TaskSortingPolicy.kt45
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/workload/workflow/Job.kt48
-rw-r--r--opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/workload/workflow/Task.kt48
-rw-r--r--settings.gradle.kts13
127 files changed, 194 insertions, 5674 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/CONTRIBUTING.md
diff --git a/README.md b/README.md
index 54fa77cb..b4da4287 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
<img src="misc/artwork/logo.png" width="100" alt="OpenDC">
</a>
<br>
- odcsim
+ OpenDC
</h1>
<p align="center">
<a href="https://travis-ci.org/atlarge-research/opendc-simulator">
@@ -13,6 +13,10 @@
<img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="MIT License">
</a>
</p>
+<p align="center">
+ Collaborative Datacenter Simulation and Exploration for Everybody
+</p>
+
## Introduction
**odcsim** is a framework for discrete event simulation in Kotlin and Java, used
@@ -33,79 +37,6 @@ The documentation is located in the [docs/](docs/) directory and is divided as f
* [API Reference](https://atlarge-research.github.io/opendc-simulator)
* [Contributing Guide](CONTRIBUTING.md)
-## Getting Started
-
-### Installation
-Please add the required packages as dependency in your project.
-Releases are available in the [Maven Central Repository](https://search.maven.org/).
-
-The package `odcsim-core` is required to construct a simulation model.
-A `odcsim-engine-*` package is needed for running the simulation
-model.
-
-**Gradle**
-```groovy
-compile 'com.atlarge.odcsim:odcsim-core:2.0.0'
-compile 'com.atlarge.odcsim:odcsim-engine-omega:2.0.0'
-```
-
-**Maven**
-```xml
-<dependency>
- <groupId>com.atlarge.odcsim</groupId>
- <artifactId>odcsim-core</artifactId>
- <version>2.0.0</version>
-</dependency>
-
-<dependency>
- <groupId>com.atlarge.odcsim</groupId>
- <artifactId>odcsim-engine-omega</artifactId>
- <version>2.0.0</version>
-</dependency>
-```
-
-### Construction of Simulation Model
-Let's construct a simple simulation model of a single car actor.
-The car will alternately drive and park for a while. When it starts
-driving (or parking), it will print the current simulation time.
-
-
-```kotlin
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.coroutines.suspending
-import com.atlarge.odcsim.coroutines.dsl.timeout
-
-fun car(): Behavior<Nothing> =
- suspending { ctx ->
- while (true) {
- println("Start parking at ${ctx.time}")
- val parkingDuration = 5.0
- timeout(parkingDuration)
-
- println("Start driving at ${ctx.time}")
- val tripDuration = 2.0
- timeout(tripDuration)
- }
-
- stopped()
- }
-```
-
-### Running Simulation
-Running the constructed simulation model requires an implementation
-of the `ActorSystem` interface provided by one of the `odcsim-engine-*`
-packages. The [ServiceLoader](https://docs.oracle.com/javase/9/docs/api/java/util/ServiceLoader.html)
-class found in the JDK can be used to locate the `ActorSystem` implementation on the classpath.
-```kotlin
-import com.atlarge.odcsim.ActorSystemFactory
-import java.util.ServiceLoader
-
-val factory = ServiceLoader.load(ActorSystemFactory::class.java).first()
-val system = factory(car(), name = "car")
-system.run(until = 10.0)
-system.terminate()
-```
-
## Contributing
### Contributing Guide
Read our [contributing guide](CONTRIBUTING.md) to learn about our
@@ -113,4 +44,4 @@ development process, how to propose bug fixes and improvements, and how
to build and test your changes to the project.
### License
-**odcsim** is [MIT licensed](https://github.com/atlarge-research/opendc-simulator/blob/master/LICENSE.txt).
+The OpenDC simulator is [MIT licensed](https://github.com/atlarge-research/opendc-simulator/blob/master/LICENSE.txt).
diff --git a/build.gradle.kts b/build.gradle.kts
index 01f95b26..1dd5132c 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -23,29 +23,18 @@
*/
plugins {
- kotlin("jvm") version "1.3.30" apply false
- id("org.jetbrains.dokka") version "0.9.18" apply false
- id("org.jlleitschuh.gradle.ktlint") version "7.4.0" apply false
+ `dokka-convention`
}
allprojects {
group = "com.atlarge.opendc"
version = "2.0.0"
-
extra["junitJupiterVersion"] = "5.4.2"
extra["junitPlatformVersion"] = "1.4.2"
extra["githubUrl"] = "https://github.com/atlarge-research/${rootProject.name}"
}
tasks.wrapper {
- gradleVersion = "5.1"
-}
-
-// Wait for children to evaluate so we can configure tasks that are dependant on children
-project.evaluationDependsOnChildren()
-
-apply {
- from("gradle/jacoco.gradle")
- from("gradle/dokka.gradle")
+ gradleVersion = "6.0"
}
diff --git a/odcsim-testkit/build.gradle.kts b/buildSrc/build.gradle.kts
index 8b19019a..ee61f351 100644
--- a/odcsim-testkit/build.gradle.kts
+++ b/buildSrc/build.gradle.kts
@@ -22,22 +22,25 @@
* SOFTWARE.
*/
-/* Build configuration */
-apply(from = "../gradle/kotlin.gradle")
plugins {
- `java-library`
+ `kotlin-dsl`
}
+kotlinDslPluginOptions {
+ experimentalWarning.set(false)
+}
+
+
/* Project configuration */
repositories {
jcenter()
+ maven {
+ url = uri("https://plugins.gradle.org/m2/")
+ }
}
-val junitJupiterVersion: String by extra
-
dependencies {
- api(project(":odcsim-core"))
-
- implementation(kotlin("stdlib"))
- implementation("org.junit.jupiter:junit-jupiter-api:$junitJupiterVersion")
+ implementation(kotlin("gradle-plugin", "1.3.60"))
+ implementation("org.jlleitschuh.gradle:ktlint-gradle:9.1.1")
+ implementation("org.jetbrains.dokka:dokka-gradle-plugin:0.10.0")
}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/MachineStatus.kt b/buildSrc/settings.gradle.kts
index f4fe9494..cc3f3add 100644
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/MachineStatus.kt
+++ b/buildSrc/settings.gradle.kts
@@ -21,13 +21,3 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-
-package com.atlarge.opendc.model.resources.compute
-
-/**
- * The status of a machine.
- */
-enum class MachineStatus {
- HALT,
- RUNNING
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/User.kt b/buildSrc/src/main/kotlin/dokka-convention.gradle.kts
index 502f7a74..95183df2 100644
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/User.kt
+++ b/buildSrc/src/main/kotlin/dokka-convention.gradle.kts
@@ -22,14 +22,12 @@
* SOFTWARE.
*/
-package com.atlarge.opendc.model
+import org.jetbrains.dokka.gradle.DokkaTask
-/**
- * A user of the cloud network.
- */
-interface User : Identity {
- /**
- * The name of the user.
- */
- override val name: String
+plugins {
+ id("org.jetbrains.dokka")
+}
+
+tasks.getting(DokkaTask::class) {
+ outputFormat = "html"
}
diff --git a/opendc-format/build.gradle.kts b/buildSrc/src/main/kotlin/jacoco-aggregation.gradle.kts
index 68f9aa5d..8c07fdea 100644
--- a/opendc-format/build.gradle.kts
+++ b/buildSrc/src/main/kotlin/jacoco-aggregation.gradle.kts
@@ -22,30 +22,29 @@
* SOFTWARE.
*/
-/* Build configuration */
-apply(from = "../gradle/kotlin.gradle")
+
plugins {
- `java-library`
+ jacoco
}
-/* Project configuration */
repositories {
- jcenter()
+ mavenLocal()
+ mavenCentral()
}
-val junitJupiterVersion: String by extra
-val junitPlatformVersion: String by extra
+task<JacocoReport>("jacocoTestReport") {
+ group = "Coverage reports"
+ description = "Generates an aggregate report from all subprojects"
-dependencies {
- api(project(":odcsim-core"))
- api(project(":opendc-core"))
+ val jacocoReportTasks = subprojects.map { it.tasks.withType<JacocoReport>() }
+ dependsOn(jacocoReportTasks)
+ executionData(jacocoReportTasks)
- implementation(kotlin("stdlib"))
+ subprojects.forEach { testedProject ->
+ val sourceSets = testedProject.convention.findPlugin(JavaPluginConvention::class)?.sourceSets ?: return@forEach
- testImplementation(project(":odcsim-testkit"))
- testImplementation("org.junit.jupiter:junit-jupiter-api:$junitJupiterVersion")
- testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$junitJupiterVersion")
- testImplementation("org.junit.platform:junit-platform-launcher:$junitPlatformVersion")
- testRuntimeOnly("org.slf4j:slf4j-simple:1.7.25")
- testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.0.0")
+ this@task.additionalSourceDirs.from(sourceSets["main"].allSource.srcDirs)
+ this@task.sourceDirectories.from(sourceSets["main"].allSource.srcDirs)
+ this@task.classDirectories.from(sourceSets["main"].output)
+ }
}
diff --git a/opendc-experiments-tpds/build.gradle.kts b/buildSrc/src/main/kotlin/kotlin-library-convention.gradle.kts
index 3ec580af..b27b12f5 100644
--- a/opendc-experiments-tpds/build.gradle.kts
+++ b/buildSrc/src/main/kotlin/kotlin-library-convention.gradle.kts
@@ -22,11 +22,13 @@
* SOFTWARE.
*/
-/* Build configuration */
-apply(from = "../gradle/kotlin.gradle")
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
plugins {
`java-library`
- application
+ kotlin("jvm")
+ id("org.jlleitschuh.gradle.ktlint")
+ jacoco
}
/* Project configuration */
@@ -34,17 +36,22 @@ repositories {
jcenter()
}
-application {
- mainClassName = "com.atlarge.opendc.experiments.tpds.TestExperiment"
+java {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+}
+
+tasks.withType<KotlinCompile>().configureEach {
+ kotlinOptions.jvmTarget = "1.8"
+}
+
+tasks.test {
+ useJUnitPlatform()
+ reports.html.isEnabled = true
}
-dependencies {
- api(project(":opendc-core"))
- implementation(project(":opendc-format-gwf"))
- implementation(project(":opendc-format-sc18"))
- implementation(project(":opendc-workflows"))
- implementation(kotlin("stdlib"))
- runtimeOnly(project(":odcsim-engine-omega"))
- runtimeOnly("org.apache.logging.log4j:log4j-slf4j-impl:2.11.2")
+tasks.jacocoTestReport {
+ reports {
+ html.isEnabled = true
+ }
}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Identity.kt b/buildSrc/src/main/kotlin/library.kt
index 2455d138..44355614 100644
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Identity.kt
+++ b/buildSrc/src/main/kotlin/library.kt
@@ -22,21 +22,23 @@
* SOFTWARE.
*/
-package com.atlarge.opendc.model
-
-import java.util.UUID
-
/**
- * An object that has a unique identity.
+ * This object contains the versions of the dependencies shared by the different
+ * subprojects.
*/
-interface Identity {
+object Library {
+ /**
+ * The library for testing the projects.
+ */
+ val JUNIT_JUPITER = "5.5.2"
+
/**
- * A unique, opaque, system-generated value, representing the object.
+ * The library for hosting the tests.
*/
- val uid: UUID
+ val JUNIT_PLATFORM = "1.5.2"
/**
- * A non-empty, human-readable string representing the object.
+ * Logging facade.
*/
- val name: String
+ val SLF4J = "1.7.29"
}
diff --git a/gradle/dokka.gradle b/gradle/dokka.gradle
deleted file mode 100644
index 576dbbeb..00000000
--- a/gradle/dokka.gradle
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2018 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.
- */
-
-/* Documentation generation for project */
-apply plugin: 'org.jetbrains.dokka'
-
-repositories {
- jcenter()
-}
-
-dokka {
- moduleName = 'odcsim'
- outputFormat = 'html'
- kotlinTasks {
- subprojects.compileKotlin
- }
- includes = ['docs/packages.md']
- samples = []
- jdkVersion = 8
-
- linkMapping {
- dir = rootProject.projectDir.absolutePath
- url = "$githubUrl/tree/master"
- suffix = '#L'
- }
-}
diff --git a/gradle/jacoco.gradle b/gradle/jacoco.gradle
deleted file mode 100644
index 687ad093..00000000
--- a/gradle/jacoco.gradle
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2018 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.
- */
-
-/* Jacoco task for root project to generate merged report */
-apply plugin: 'jacoco'
-
-repositories {
- mavenLocal()
- mavenCentral()
-}
-
-task jacocoMerge(type: JacocoMerge, dependsOn: subprojects.test) {
- executionData = files(subprojects.jacocoTestReport.executionData)
-
- doFirst {
- executionData = files(executionData.findAll { it.exists() })
- }
-}
-
-task jacocoTestReport(type: JacocoReport, dependsOn: jacocoMerge) {
- group = 'Coverage reports'
- description = 'Generate an aggregate report from all subprojects'
-
- executionData tasks.jacocoMerge.destinationFile
- subprojects.each {
- sourceSets it.sourceSets.main
- }
-
- reports {
- html.enabled = true
- xml.enabled = true
- xml.destination file("${buildDir}/reports/jacoco/report.xml")
- }
-}
diff --git a/gradle/kotlin.gradle b/gradle/kotlin.gradle
deleted file mode 100644
index e24a3c70..00000000
--- a/gradle/kotlin.gradle
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2017 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.
- */
-
-/* Default configuration for Kotlin projects */
-apply plugin: 'kotlin'
-apply plugin: 'org.jlleitschuh.gradle.ktlint'
-apply plugin: 'jacoco'
-
-sourceCompatibility = 1.8
-
-compileKotlin {
- kotlinOptions {
- jvmTarget = '1.8'
- }
-}
-
-compileTestKotlin {
- kotlinOptions {
- jvmTarget = '1.8'
- }
-}
-
-/* Configure test setup */
-test {
- useJUnitPlatform {}
-
- testLogging {
- events 'passed', 'skipped', 'failed'
- }
-
- reports {
- html.enabled = true
- }
-
- finalizedBy jacocoTestReport
-}
-
-/* Coverage */
-jacocoTestReport {
- reports {
- html.enabled = true
- }
-}
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 6b3851a8..6ce793f2 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/BehaviorTestKit.kt b/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/BehaviorTestKit.kt
deleted file mode 100644
index 65782d52..00000000
--- a/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/BehaviorTestKit.kt
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.odcsim.testkit
-
-import com.atlarge.odcsim.ActorContext
-import com.atlarge.odcsim.ActorPath
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.Instant
-import com.atlarge.odcsim.isAlive
-import com.atlarge.odcsim.testkit.internal.BehaviorTestKitImpl
-import java.util.UUID
-
-/**
- * Utensils for synchronous testing of [Behavior] instances.
- *
- * @param T The shape of the messages the behavior accepts.
- */
-interface BehaviorTestKit<T : Any> {
- /**
- * The current point in simulation time.
- */
- val time: Instant
-
- /**
- * The current behavior of the simulated actor.
- */
- val behavior: Behavior<T>
-
- /**
- * The self reference to the simulated actor inside the test kit.
- */
- val ref: ActorRef<T>
-
- /**
- * The context of the simulated actor.
- */
- val context: ActorContext<T>
-
- /**
- * The inbox of the simulated actor.
- */
- val inbox: TestInbox<T>
-
- /**
- * A flag indicating whether the [Behavior] instance is still alive.
- */
- val isAlive: Boolean get() = behavior.isAlive
-
- /**
- * Interpret the specified message at the current point in simulation time using the current behavior.
- *
- * @return `true` if the message was handled by the behavior, `false` if it was unhandled.
- */
- fun run(msg: T): Boolean
-
- /**
- * Interpret the oldest message in the inbox using the current behavior.
- *
- * @return `true` if the message was handled by the behavior, `false` if it was unhandled.
- * @throws NoSuchElementException if the actor's inbox is empty.
- */
- fun runOne(): Boolean
-
- /**
- * Interpret the messages in the inbox until the specified point in simulation time is reached.
- *
- * @param time The time until which the messages in the inbox should be processed.
- */
- fun runTo(time: Instant)
-
- /**
- * Create an anonymous [TestInbox] for receiving messages.
- */
- fun <U : Any> createInbox(): TestInbox<U>
-
- /**
- * Get the child inbox for the child with the given name, or fail if there is no child with the given name
- * spawned
- */
- fun <U : Any> childInbox(name: String): TestInbox<U>
-
- /**
- * Get the child inbox for the child referenced by [ref], or fail if it is not a child of this behavior.
- */
- fun <U : Any> childInbox(ref: ActorRef<U>): TestInbox<U>
-
- /**
- * Obtain the [BehaviorTestKit] for the child with the given name, or fail if there is no child with the given
- * name spawned.
- */
- fun <U : Any> childTestKit(name: String): BehaviorTestKit<U>
-
- /**
- * Obtain the [BehaviorTestKit] for the given child [ActorRef].
- */
- fun <U : Any> childTestKit(ref: ActorRef<U>): BehaviorTestKit<U>
-
- companion object {
- /**
- * Create a [BehaviorTestKit] instance for the specified [Behavior].
- *
- * @param behavior The behavior for which a test kit should be created.
- */
- operator fun <T : Any> invoke(behavior: Behavior<T>): BehaviorTestKit<T> =
- BehaviorTestKitImpl(behavior, ActorPath.Root(name = "/" + UUID.randomUUID().toString()))
-
- /**
- * Create a [BehaviorTestKit] instance for the specified [Behavior].
- *
- * @param behavior The behavior for which a test kit should be created.
- */
- @JvmStatic
- fun <T : Any> create(behavior: Behavior<T>): BehaviorTestKit<T> = invoke(behavior)
- }
-}
diff --git a/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/TestInbox.kt b/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/TestInbox.kt
deleted file mode 100644
index de240143..00000000
--- a/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/TestInbox.kt
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.odcsim.testkit
-
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Envelope
-
-/**
- * A helper class for testing messages sent to an [ActorRef].
- *
- * @param T The shape of the messages the inbox accepts.
- */
-interface TestInbox<T : Any> {
- /**
- * The actor reference of this inbox.
- */
- val ref: ActorRef<T>
-
- /**
- * A flag to indicate whether the inbox contains any messages.
- */
- val hasMessages: Boolean
-
- /**
- * Receive the oldest message from the inbox and remove it.
- *
- * @return The message that has been received.
- * @throws NoSuchElementException if the inbox is empty.
- */
- fun receiveMessage(): T = receiveEnvelope().message
-
- /**
- * Receive the oldest message from the inbox and remove it.
- *
- * @return The envelope containing the message that has been received.
- * @throws NoSuchElementException if the inbox is empty.
- */
- fun receiveEnvelope(): Envelope<T>
-
- /**
- * Receive all messages from the inbox and empty it.
- *
- * @return The list of messages in the inbox.
- */
- fun receiveAll(): List<Envelope<T>>
-
- /**
- * Clear all messages from the inbox.
- */
- fun clear()
-
- /**
- * Assert that the oldest message is equal to the [expected] message and remove
- * it from the inbox.
- *
- * @param expected The expected message to be the oldest in the inbox.
- */
- fun expectMessage(expected: T)
-
- /**
- * Assert that the oldest message is equal to the [expected] message and remove
- * it from the inbox.
- *
- * @param expected The expected message to be the oldest in the inbox.
- * @param message The failure message to fail with.
- */
- fun expectMessage(expected: T, message: String)
-}
diff --git a/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/ActorContextStub.kt b/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/ActorContextStub.kt
deleted file mode 100644
index 79873141..00000000
--- a/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/ActorContextStub.kt
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.odcsim.testkit.internal
-
-import com.atlarge.odcsim.ActorContext
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.ActorSystem
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.Duration
-import com.atlarge.odcsim.Instant
-import com.atlarge.odcsim.internal.logging.LoggerImpl
-import org.slf4j.Logger
-import java.util.UUID
-
-/**
- * A stubbed [ActorContext] implementation for synchronous behavior testing.
- *
- * @property owner The owner of this context.
- */
-internal class ActorContextStub<T : Any>(private val owner: BehaviorTestKitImpl<T>) : ActorContext<T> {
- /**
- * The children of this context.
- */
- val childActors = HashMap<String, BehaviorTestKitImpl<*>>()
-
- override val self: ActorRef<T>
- get() = owner.ref
-
- override val children: List<ActorRef<*>>
- get() = childActors.values.map { it.ref }
-
- override val time: Instant
- get() = owner.time
-
- override val system: ActorSystem<*> by lazy {
- ActorSystemStub(owner)
- }
-
- override val log: Logger by lazy {
- LoggerImpl(this)
- }
-
- override fun getChild(name: String): ActorRef<*>? = childActors[name]?.ref
-
- override fun <U : Any> send(ref: ActorRef<U>, msg: U, after: Duration) {
- if (ref !is TestInboxImpl.ActorRefImpl) {
- throw IllegalArgumentException("The referenced ActorRef is not part of the test kit")
- }
-
- ref.send(msg, after)
- }
-
- override fun <U : Any> spawn(behavior: Behavior<U>, name: String): ActorRef<U> {
- val btk = BehaviorTestKitImpl(behavior, self.path.child(name))
- childActors[name] = btk
- return btk.ref
- }
-
- override fun <U : Any> spawnAnonymous(behavior: Behavior<U>): ActorRef<U> {
- return spawn(behavior, "$" + UUID.randomUUID())
- }
-
- override fun stop(child: ActorRef<*>) {
- require(child.path.parent == self.path) { "Only direct children of an actor may be stopped through the actor context." }
- childActors -= child.path.name
- }
-
- override fun watch(target: ActorRef<*>) {}
-
- override fun unwatch(target: ActorRef<*>) {}
-
- override fun sync(target: ActorRef<*>) {}
-
- override fun unsync(target: ActorRef<*>) {}
-
- override fun isSync(target: ActorRef<*>): Boolean = true
-}
diff --git a/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/ActorSystemStub.kt b/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/ActorSystemStub.kt
deleted file mode 100644
index fee34a48..00000000
--- a/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/ActorSystemStub.kt
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.odcsim.testkit.internal
-
-import com.atlarge.odcsim.ActorPath
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.ActorSystem
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.Duration
-import com.atlarge.odcsim.Instant
-
-/**
- * A stubbed [ActorSystem] for synchronous testing of behavior.
- *
- * @property owner The owner of this actor system.
- */
-internal class ActorSystemStub<T : Any>(private val owner: BehaviorTestKitImpl<T>) : ActorSystem<T> {
- override val time: Instant
- get() = owner.time
-
- override val name: String
- get() = owner.ref.path.name
-
- override fun run(until: Duration) = throw IllegalStateException("Cannot run ActorSystem within actor")
-
- override fun send(msg: T, after: Duration) = owner.context.send(owner.context.self, msg, after)
-
- override fun terminate() {}
-
- override val path: ActorPath
- get() = owner.ref.path
-
- override suspend fun <U : Any> spawnSystem(behavior: Behavior<U>, name: String): ActorRef<U> {
- throw IllegalStateException("Cannot spawn system actor")
- }
-}
diff --git a/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/BehaviorTestKitImpl.kt b/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/BehaviorTestKitImpl.kt
deleted file mode 100644
index 2bd5b973..00000000
--- a/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/BehaviorTestKitImpl.kt
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.odcsim.testkit.internal
-
-import com.atlarge.odcsim.ActorPath
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.Instant
-import com.atlarge.odcsim.internal.BehaviorInterpreter
-import com.atlarge.odcsim.testkit.BehaviorTestKit
-import com.atlarge.odcsim.testkit.TestInbox
-import java.util.UUID
-import kotlin.math.max
-
-/**
- * Default implementation of the [BehaviorTestKit] interface.
- *
- * @param initialBehavior The initial behavior to initialize the actor of the test kit with.
- * @param path The path to the actor.
- */
-internal class BehaviorTestKitImpl<T : Any>(
- initialBehavior: Behavior<T>,
- path: ActorPath
-) : BehaviorTestKit<T> {
- /**
- * The [BehaviorInterpreter] used to interpret incoming messages.
- */
- private val interpreter = BehaviorInterpreter(initialBehavior)
-
- /**
- * A flag to indicate whether the behavior was initially started.
- */
- private var isStarted: Boolean = false
-
- override var time: Instant = .0
- private set
-
- override val inbox: TestInbox<T> = TestInboxImpl(this, path)
-
- override val behavior: Behavior<T> get() = interpreter.behavior
-
- override val ref: ActorRef<T> = inbox.ref
-
- override val context: ActorContextStub<T> = ActorContextStub(this)
-
- override fun run(msg: T): Boolean {
- if (!isStarted) {
- isStarted = true
- interpreter.start(context)
- }
-
- return interpreter.interpretMessage(context, msg)
- }
-
- override fun runOne(): Boolean {
- val (delivery, msg) = inbox.receiveEnvelope()
- time = max(time, delivery)
- return run(msg)
- }
-
- override fun runTo(time: Instant) {
- while (inbox.hasMessages && this.time <= time) {
- runOne()
- }
- this.time = time
- }
-
- override fun <U : Any> createInbox(): TestInbox<U> {
- return TestInboxImpl(this, ref.path.child(UUID.randomUUID().toString()))
- }
-
- override fun <U : Any> childInbox(name: String): TestInbox<U> = childTestKit<U>(name).inbox
-
- override fun <U : Any> childInbox(ref: ActorRef<U>): TestInbox<U> = childTestKit(ref).inbox
-
- override fun <U : Any> childTestKit(name: String): BehaviorTestKit<U> {
- @Suppress("UNCHECKED_CAST")
- return context.childActors[ref.path.name] as BehaviorTestKitImpl<U>? ?: throw IllegalArgumentException("$ref is not a child of $this")
- }
-
- override fun <U : Any> childTestKit(ref: ActorRef<U>): BehaviorTestKit<U> {
- val btk = childTestKit<U>(ref.path.name)
-
- if (btk.ref != ref) {
- throw IllegalArgumentException("$ref is not a child of $this")
- }
-
- return btk
- }
-}
diff --git a/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/TestInboxImpl.kt b/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/TestInboxImpl.kt
deleted file mode 100644
index 35abd758..00000000
--- a/odcsim-testkit/src/main/kotlin/com/atlarge/odcsim/testkit/internal/TestInboxImpl.kt
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.odcsim.testkit.internal
-
-import com.atlarge.odcsim.ActorPath
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Envelope
-import com.atlarge.odcsim.Instant
-import com.atlarge.odcsim.testkit.TestInbox
-import org.junit.jupiter.api.Assertions.assertEquals
-import java.util.PriorityQueue
-
-/**
- * A helper class for testing messages sent to an [ActorRef].
- *
- * @param owner The owner of the inbox.
- * @param path The path to the test inbox.
- * @param T The shape of the messages the inbox accepts.
- */
-internal class TestInboxImpl<T : Any>(private val owner: BehaviorTestKitImpl<*>, path: ActorPath) : TestInbox<T> {
- /**
- * The queue of received messages.
- */
- private val inbox = PriorityQueue<Envelope<T>>()
-
- /**
- * The identifier for the next message to be scheduled.
- */
- private var nextId: Long = 0
-
- override val ref: ActorRef<T> = ActorRefImpl(path)
-
- override val hasMessages: Boolean
- get() = inbox.isNotEmpty()
-
- override fun receiveEnvelope(): Envelope<T> = inbox.remove()
-
- override fun receiveAll(): List<Envelope<T>> = inbox.toList().also { inbox.clear() }
-
- override fun clear() = inbox.clear()
-
- override fun expectMessage(expected: T) = assertEquals(expected, receiveMessage())
-
- override fun expectMessage(expected: T, message: String) = assertEquals(expected, receiveMessage(), message)
-
- internal inner class ActorRefImpl(override val path: ActorPath) : ActorRef<T> {
- /**
- * Send the specified message to the actor this reference is pointing to after the specified delay.
- *
- * @param msg The message to send.
- * @param after The delay before the message is received.
- */
- fun send(msg: T, after: Instant) {
- inbox.add(EnvelopeImpl(nextId++, owner.time + after, msg))
- }
- }
-
- /**
- * A wrapper around a message that has been scheduled for processing.
- *
- * @property id The identifier of the message to keep the priority queue stable.
- * @property time The point in time to deliver the message.
- * @property message The message to wrap.
- */
- private inner class EnvelopeImpl(
- val id: Long,
- override val time: Instant,
- override val message: T
- ) : Envelope<T> {
- override fun compareTo(other: Envelope<*>): Int {
- val cmp = super.compareTo(other)
- return if (cmp == 0 && other is EnvelopeImpl)
- id.compareTo(other.id)
- else
- cmp
- }
- }
-}
diff --git a/odcsim/README.md b/odcsim/README.md
new file mode 100644
index 00000000..00d6a2fe
--- /dev/null
+++ b/odcsim/README.md
@@ -0,0 +1,100 @@
+<h1 align="center">
+ <a href="http://opendc.org/">
+ <img src="../misc/artwork/logo.png" width="100" alt="OpenDC">
+ </a>
+ <br>
+ odcsim
+</h1>
+
+## Introduction
+**odcsim** is a framework for discrete event simulation in Kotlin and Java, used
+by the [OpenDC](https://opendc.org) project.
+Simulations are defined in terms of a hierarchical grouping of actors
+and the interactions between these actors
+([Actor model](https://en.wikipedia.org/wiki/Actor_model)), using
+an API very similar to [Akka Typed](https://doc.akka.io/docs/akka/current/typed/index.html).
+
+## Documentation
+Check out the [Getting Started](#getting-started) section for a quick
+overview.
+The documentation is located in the [docs/](docs/) directory and is divided as follows:
+* [Main Concepts](docs/concepts.md)
+* [Building a Model](docs/build.md)
+* [Running a Model](docs/run.md)
+* [Pre-built Models](docs/models.md)
+* [API Reference](https://atlarge-research.github.io/opendc-simulator)
+* [Contributing Guide](CONTRIBUTING.md)
+
+## Getting Started
+
+### Installation
+Please add the required packages as dependency in your project.
+Releases are available in the [Maven Central Repository](https://search.maven.org/).
+
+The package `odcsim-core` is required to construct a simulation model.
+A `odcsim-engine-*` package is needed for running the simulation
+model.
+
+**Gradle**
+```groovy
+compile 'com.atlarge.odcsim:odcsim-core:2.0.0'
+compile 'com.atlarge.odcsim:odcsim-engine-omega:2.0.0'
+```
+
+**Maven**
+```xml
+<dependency>
+ <groupId>com.atlarge.odcsim</groupId>
+ <artifactId>odcsim-core</artifactId>
+ <version>2.0.0</version>
+</dependency>
+
+<dependency>
+ <groupId>com.atlarge.odcsim</groupId>
+ <artifactId>odcsim-engine-omega</artifactId>
+ <version>2.0.0</version>
+</dependency>
+```
+
+### Construction of Simulation Model
+Let's construct a simple simulation model of a single car actor.
+The car will alternately drive and park for a while. When it starts
+driving (or parking), it will print the current simulation time.
+
+
+```kotlin
+import com.atlarge.odcsim.Behavior
+import com.atlarge.odcsim.coroutines.suspending
+import com.atlarge.odcsim.coroutines.dsl.timeout
+
+fun car(): Behavior<Nothing> =
+ suspending { ctx ->
+ while (true) {
+ println("Start parking at ${ctx.time}")
+ val parkingDuration = 5.0
+ timeout(parkingDuration)
+
+ println("Start driving at ${ctx.time}")
+ val tripDuration = 2.0
+ timeout(tripDuration)
+ }
+
+ stopped()
+ }
+```
+
+### Running Simulation
+Running the constructed simulation model requires an implementation
+of the `ActorSystem` interface provided by one of the `odcsim-engine-*`
+packages. The [ServiceLoader](https://docs.oracle.com/javase/9/docs/api/java/util/ServiceLoader.html)
+class found in the JDK can be used to locate the `ActorSystem` implementation on the classpath.
+```kotlin
+import com.atlarge.odcsim.ActorSystemFactory
+import java.util.ServiceLoader
+
+val factory = ServiceLoader.load(ActorSystemFactory::class.java).first()
+val system = factory(car(), name = "car")
+system.run(until = 10.0)
+system.terminate()
+```
+
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/ProcessingElement.kt b/odcsim/build.gradle.kts
index 9e5b1b71..cc3f3add 100644
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/ProcessingElement.kt
+++ b/odcsim/build.gradle.kts
@@ -21,13 +21,3 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-
-package com.atlarge.opendc.model.resources.compute
-
-/**
- * A logical core in a CPU.
- *
- * @property id The identifier of the core within the CPU.
- * @property unit The [ProcessingUnit] the core is part of.
- */
-data class ProcessingElement(val id: Int, val unit: ProcessingUnit)
diff --git a/odcsim-core/build.gradle.kts b/odcsim/odcsim-core/build.gradle.kts
index 4260aaad..013d1598 100644
--- a/odcsim-core/build.gradle.kts
+++ b/odcsim/odcsim-core/build.gradle.kts
@@ -23,25 +23,16 @@
*/
/* Build configuration */
-apply(from = "../gradle/kotlin.gradle")
plugins {
- `java-library`
+ `kotlin-library-convention`
}
-/* Project configuration */
-repositories {
- jcenter()
-}
-
-val junitJupiterVersion: String by extra
-val junitPlatformVersion: String by extra
-
dependencies {
implementation(kotlin("stdlib"))
- api("org.slf4j:slf4j-api:1.7.26")
+ api("org.slf4j:slf4j-api:${Library.SLF4J}")
- testImplementation("org.junit.jupiter:junit-jupiter-api:$junitJupiterVersion")
- testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$junitJupiterVersion")
- testImplementation("org.junit.platform:junit-platform-launcher:$junitPlatformVersion")
+ testImplementation("org.junit.jupiter:junit-jupiter-api:${Library.JUNIT_JUPITER}")
+ testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${Library.JUNIT_JUPITER}")
+ testImplementation("org.junit.platform:junit-platform-launcher:${Library.JUNIT_PLATFORM}")
testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.0.0")
}
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorContext.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorContext.kt
index dc6ca7ec..dc6ca7ec 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorContext.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorContext.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorPath.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorPath.kt
index a6c716a2..a6c716a2 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorPath.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorPath.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorRef.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorRef.kt
index 45fc756e..45fc756e 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorRef.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorRef.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorSystem.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorSystem.kt
index d65beebd..d65beebd 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorSystem.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorSystem.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorSystemFactory.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorSystemFactory.kt
index f59bc966..f59bc966 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorSystemFactory.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/ActorSystemFactory.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Behavior.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Behavior.kt
index 9ad7f83f..9ad7f83f 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Behavior.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Behavior.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Behaviors.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Behaviors.kt
index eac254ec..eac254ec 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Behaviors.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Behaviors.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Envelope.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Envelope.kt
index 3b73d52d..3b73d52d 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Envelope.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Envelope.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Signals.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Signals.kt
index 9b707348..9b707348 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Signals.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Signals.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/StashBuffer.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/StashBuffer.kt
index 5d73d808..5d73d808 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/StashBuffer.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/StashBuffer.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Time.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Time.kt
index f19f6fe2..f19f6fe2 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Time.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/Time.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/TimerScheduler.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/TimerScheduler.kt
index c5c54b64..c5c54b64 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/TimerScheduler.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/TimerScheduler.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/Behavior.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/Behavior.kt
index eb26add1..eb26add1 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/Behavior.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/Behavior.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/dsl/Receive.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/dsl/Receive.kt
index e995c0e3..e995c0e3 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/dsl/Receive.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/dsl/Receive.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/dsl/Timeout.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/dsl/Timeout.kt
index 16b6f534..16b6f534 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/dsl/Timeout.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/coroutines/dsl/Timeout.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/ActorContext.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/ActorContext.kt
index f1aba25e..f1aba25e 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/ActorContext.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/ActorContext.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/Behavior.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/Behavior.kt
index b07cabc0..b07cabc0 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/Behavior.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/Behavior.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/BehaviorInterpreter.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/BehaviorInterpreter.kt
index 194c2a62..194c2a62 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/BehaviorInterpreter.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/BehaviorInterpreter.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/Coroutines.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/Coroutines.kt
index 82b29715..82b29715 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/Coroutines.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/Coroutines.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/StashBufferImpl.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/StashBufferImpl.kt
index 24c3a9d5..24c3a9d5 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/StashBufferImpl.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/StashBufferImpl.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/TimerSchedulerImpl.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/TimerSchedulerImpl.kt
index 22bec507..22bec507 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/TimerSchedulerImpl.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/TimerSchedulerImpl.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LocationAwareLoggerImpl.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LocationAwareLoggerImpl.kt
index bf50b5e8..bf50b5e8 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LocationAwareLoggerImpl.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LocationAwareLoggerImpl.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LocationIgnorantLoggerImpl.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LocationIgnorantLoggerImpl.kt
index 999e30e6..999e30e6 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LocationIgnorantLoggerImpl.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LocationIgnorantLoggerImpl.kt
diff --git a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LoggerImpl.kt b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LoggerImpl.kt
index f971f08d..f971f08d 100644
--- a/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LoggerImpl.kt
+++ b/odcsim/odcsim-core/src/main/kotlin/com/atlarge/odcsim/internal/logging/LoggerImpl.kt
diff --git a/odcsim-core/src/test/kotlin/com/atlarge/odcsim/ActorPathTest.kt b/odcsim/odcsim-core/src/test/kotlin/com/atlarge/odcsim/ActorPathTest.kt
index 023d3efd..023d3efd 100644
--- a/odcsim-core/src/test/kotlin/com/atlarge/odcsim/ActorPathTest.kt
+++ b/odcsim/odcsim-core/src/test/kotlin/com/atlarge/odcsim/ActorPathTest.kt
diff --git a/odcsim-core/src/test/kotlin/com/atlarge/odcsim/BehaviorTest.kt b/odcsim/odcsim-core/src/test/kotlin/com/atlarge/odcsim/BehaviorTest.kt
index 1eb4f3b9..1eb4f3b9 100644
--- a/odcsim-core/src/test/kotlin/com/atlarge/odcsim/BehaviorTest.kt
+++ b/odcsim/odcsim-core/src/test/kotlin/com/atlarge/odcsim/BehaviorTest.kt
diff --git a/odcsim-core/src/test/kotlin/com/atlarge/odcsim/CoroutinesTest.kt b/odcsim/odcsim-core/src/test/kotlin/com/atlarge/odcsim/CoroutinesTest.kt
index af7619e6..af7619e6 100644
--- a/odcsim-core/src/test/kotlin/com/atlarge/odcsim/CoroutinesTest.kt
+++ b/odcsim/odcsim-core/src/test/kotlin/com/atlarge/odcsim/CoroutinesTest.kt
diff --git a/odcsim-engine-omega/build.gradle.kts b/odcsim/odcsim-engine-omega/build.gradle.kts
index 57e68b2c..d4383303 100644
--- a/odcsim-engine-omega/build.gradle.kts
+++ b/odcsim/odcsim-engine-omega/build.gradle.kts
@@ -23,9 +23,8 @@
*/
/* Build configuration */
-apply(from = "../gradle/kotlin.gradle")
plugins {
- `java-library`
+ `kotlin-library-convention`
}
/* Project configuration */
@@ -33,18 +32,15 @@ repositories {
jcenter()
}
-val junitJupiterVersion: String by extra
-val junitPlatformVersion: String by extra
-
dependencies {
- api(project(":odcsim-core"))
+ api(project(":odcsim:odcsim-core"))
implementation(kotlin("stdlib"))
implementation("org.jetbrains:annotations:17.0.0")
- testCompile(project(":odcsim-engine-tests"))
- testImplementation("org.junit.jupiter:junit-jupiter-api:$junitJupiterVersion")
- testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$junitJupiterVersion")
- testImplementation("org.junit.platform:junit-platform-launcher:$junitPlatformVersion")
- testRuntimeOnly("org.slf4j:slf4j-simple:1.7.25")
+ testImplementation(project(":odcsim:odcsim-engine-tests"))
+ testImplementation("org.junit.jupiter:junit-jupiter-api:${Library.JUNIT_JUPITER}")
+ testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${Library.JUNIT_JUPITER}")
+ testImplementation("org.junit.platform:junit-platform-launcher:${Library.JUNIT_PLATFORM}")
+ testRuntimeOnly("org.slf4j:slf4j-simple:${Library.SLF4J}")
}
diff --git a/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt b/odcsim/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt
index dd92f90a..dd92f90a 100644
--- a/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt
+++ b/odcsim/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt
diff --git a/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactory.kt b/odcsim/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactory.kt
index 84bf1efb..84bf1efb 100644
--- a/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactory.kt
+++ b/odcsim/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactory.kt
diff --git a/odcsim-engine-omega/src/main/resources/META-INF/services/com.atlarge.odcsim.ActorSystemFactory b/odcsim/odcsim-engine-omega/src/main/resources/META-INF/services/com.atlarge.odcsim.ActorSystemFactory
index d0ca8859..d0ca8859 100644
--- a/odcsim-engine-omega/src/main/resources/META-INF/services/com.atlarge.odcsim.ActorSystemFactory
+++ b/odcsim/odcsim-engine-omega/src/main/resources/META-INF/services/com.atlarge.odcsim.ActorSystemFactory
diff --git a/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactoryTest.kt b/odcsim/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactoryTest.kt
index 4e195e6e..4e195e6e 100644
--- a/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactoryTest.kt
+++ b/odcsim/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactoryTest.kt
diff --git a/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemTest.kt b/odcsim/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemTest.kt
index dc310d47..dc310d47 100644
--- a/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemTest.kt
+++ b/odcsim/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemTest.kt
diff --git a/odcsim-engine-tests/build.gradle.kts b/odcsim/odcsim-engine-tests/build.gradle.kts
index 8b19019a..7b236300 100644
--- a/odcsim-engine-tests/build.gradle.kts
+++ b/odcsim/odcsim-engine-tests/build.gradle.kts
@@ -23,9 +23,8 @@
*/
/* Build configuration */
-apply(from = "../gradle/kotlin.gradle")
plugins {
- `java-library`
+ `kotlin-library-convention`
}
/* Project configuration */
@@ -33,11 +32,9 @@ repositories {
jcenter()
}
-val junitJupiterVersion: String by extra
-
dependencies {
- api(project(":odcsim-core"))
+ api(project(":odcsim:odcsim-core"))
implementation(kotlin("stdlib"))
- implementation("org.junit.jupiter:junit-jupiter-api:$junitJupiterVersion")
+ implementation("org.junit.jupiter:junit-jupiter-api:${Library.JUNIT_JUPITER}")
}
diff --git a/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemContract.kt b/odcsim/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemContract.kt
index 593f587b..593f587b 100644
--- a/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemContract.kt
+++ b/odcsim/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemContract.kt
diff --git a/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemFactoryContract.kt b/odcsim/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemFactoryContract.kt
index 565f4f4c..565f4f4c 100644
--- a/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemFactoryContract.kt
+++ b/odcsim/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemFactoryContract.kt
diff --git a/opendc-core/build.gradle.kts b/opendc-core/build.gradle.kts
deleted file mode 100644
index c89e27e6..00000000
--- a/opendc-core/build.gradle.kts
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2018 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.
- */
-
-/* Build configuration */
-apply(from = "../gradle/kotlin.gradle")
-plugins {
- `java-library`
-}
-
-/* Project configuration */
-repositories {
- jcenter()
-}
-
-val junitJupiterVersion: String by extra
-val junitPlatformVersion: String by extra
-
-dependencies {
- api(project(":odcsim-core"))
-
- implementation(kotlin("stdlib"))
-
- testImplementation(project(":odcsim-testkit"))
- testImplementation(project(":odcsim-engine-omega"))
- testImplementation("org.junit.jupiter:junit-jupiter-api:$junitJupiterVersion")
- testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$junitJupiterVersion")
- testImplementation("org.junit.platform:junit-platform-launcher:$junitPlatformVersion")
- testRuntimeOnly("org.slf4j:slf4j-simple:1.7.25")
- testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.0.0")
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Broker.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Broker.kt
deleted file mode 100644
index 0e2adb40..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Broker.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model
-
-import com.atlarge.odcsim.Behavior
-
-/**
- * A broker acting on the various cloud platforms on behalf of the user.
- */
-interface Broker {
- /**
- * Build the runtime behavior of the [Broker].
- *
- * @param platforms A list of available cloud platforms.
- * @return The runtime behavior of the broker.
- */
- operator fun invoke(platforms: List<PlatformRef>): Behavior<*>
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Cluster.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Cluster.kt
deleted file mode 100644
index 1ed11e87..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Cluster.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model
-
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.empty
-import com.atlarge.odcsim.setup
-import com.atlarge.odcsim.unsafeCast
-import com.atlarge.opendc.model.resources.compute.host.Host
-import com.atlarge.opendc.model.services.resources.ResourceManagerRef
-import java.util.UUID
-
-/**
- * A logical grouping of heterogeneous hosts and primary storage within a zone.
- *
- * @property uid The unique identifier of the cluster.
- * @property name The name of this cluster.
- * @property hosts The machines in this cluster.
- */
-data class Cluster(override val uid: UUID, override val name: String, val hosts: List<Host>) : Identity {
- /**
- * Build the runtime [Behavior] of this cluster of hosts.
- *
- * @param manager The manager of the cluster.
- */
- operator fun invoke(manager: ResourceManagerRef): Behavior<Nothing> = setup { ctx ->
- // Launch all hosts in the cluster
- for (host in hosts) {
- ctx.spawn(host(manager.unsafeCast()), name = host.name)
- }
-
- empty()
- }
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Environment.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Environment.kt
deleted file mode 100644
index b7fe33db..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Environment.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model
-
-/**
- * A description of a large-scale computing environment. This description includes including key size and topology
- * information of the environment, types of resources, but also various operational and management rules such as
- * scheduled maintenance, allocation and other constraints.
- *
- * @property name The name of the environment.
- * @property description A small textual description about the environment that is being modeled
- * @property platforms The cloud platforms (such as AWS or GCE) in this environment.
- */
-data class Environment(val name: String, val description: String?, val platforms: List<Platform>)
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Model.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Model.kt
deleted file mode 100644
index 098bfbde..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Model.kt
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model
-
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.Terminated
-import com.atlarge.odcsim.receiveSignal
-import com.atlarge.odcsim.same
-import com.atlarge.odcsim.setup
-import com.atlarge.odcsim.stopped
-import com.atlarge.odcsim.unhandled
-
-/**
- * A simulation model for large-scale simulation of datacenter infrastructure, built with the *odcsim* API.
- *
- * @property environment The environment in which brokers operate.
- * @property brokers The brokers acting on the cloud platforms.
- */
-data class Model(val environment: Environment, val brokers: List<Broker>) {
- /**
- * Build the runtime behavior of the universe.
- */
- operator fun invoke(): Behavior<Nothing> = setup { ctx ->
- // Setup the environment
- val platforms = environment.platforms.map { platform ->
- ctx.spawn(platform(), name = platform.name)
- }
-
- // Launch all brokers
- val remaining = mutableSetOf<ActorRef<*>>()
- for (broker in brokers) {
- val ref = ctx.spawnAnonymous(broker(platforms))
- ctx.watch(ref)
- remaining += ref
- }
-
- receiveSignal { _, signal ->
- when (signal) {
- is Terminated -> {
- remaining -= signal.ref
- if (remaining.isEmpty()) stopped() else same()
- }
- else ->
- unhandled()
- }
- }
- }
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Platform.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Platform.kt
deleted file mode 100644
index 129ee3a9..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Platform.kt
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model
-
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.coroutines.actorContext
-import com.atlarge.odcsim.coroutines.dsl.ask
-import com.atlarge.odcsim.receiveMessage
-import com.atlarge.odcsim.same
-import com.atlarge.odcsim.setup
-import java.util.UUID
-
-/**
- * A representation of a cloud platform such as Amazon Web Services (AWS), Microsoft Azure or Google Cloud.
- *
- * @property uid The unique identifier of this datacenter.
- * @property name the name of the platform.
- * @property zones The availability zones available on this platform.
- */
-data class Platform(override val uid: UUID, override val name: String, val zones: List<Zone>) : Identity {
- /**
- * Build the runtime [Behavior] of this cloud platform.
- */
- operator fun invoke(): Behavior<PlatformMessage> = setup { ctx ->
- ctx.log.info("Starting cloud platform {} [{}] with {} zones", name, uid, zones.size)
-
- // Launch all zones of the cloud platform
- val zoneInstances = zones.associateWith { zone ->
- ctx.spawn(zone(), name = zone.name)
- }
-
- receiveMessage { msg ->
- when (msg) {
- is PlatformMessage.ListZones -> {
- ctx.send(msg.replyTo, PlatformResponse.Zones(ctx.self, zoneInstances.mapKeys { it.key.name }))
- same()
- }
- }
- }
- }
-}
-
-/**
- * A reference to the actor managing the zone.
- */
-typealias PlatformRef = ActorRef<PlatformMessage>
-
-/**
- * A message protocol for communicating with a cloud platform.
- */
-sealed class PlatformMessage {
- /**
- * Request the available zones on this platform.
- *
- * @property replyTo The actor address to send the response to.
- */
- data class ListZones(val replyTo: ActorRef<PlatformResponse.Zones>) : PlatformMessage()
-}
-
-/**
- * A message protocol used by platform actors to respond to [PlatformMessage]s.
- */
-sealed class PlatformResponse {
- /**
- * The zones available on this cloud platform.
- *
- * @property platform The reference to the cloud platform these are the zones of.
- * @property zones The zones in this cloud platform.
- */
- data class Zones(val platform: PlatformRef, val zones: Map<String, ZoneRef>) : PlatformResponse()
-}
-
-/**
- * Retrieve the available zones of a platform.
- */
-suspend fun PlatformRef.zones(): Map<String, ZoneRef> {
- val ctx = actorContext<Any>()
- val zones: PlatformResponse.Zones = ctx.ask(this) { PlatformMessage.ListZones(it) }
- return zones.zones
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Zone.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Zone.kt
deleted file mode 100644
index b1d00dac..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/Zone.kt
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model
-
-import com.atlarge.odcsim.ActorContext
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.ReceivingBehavior
-import com.atlarge.odcsim.Signal
-import com.atlarge.odcsim.Terminated
-import com.atlarge.odcsim.coroutines.actorContext
-import com.atlarge.odcsim.coroutines.dsl.ask
-import com.atlarge.odcsim.same
-import com.atlarge.odcsim.setup
-import com.atlarge.odcsim.unhandled
-import com.atlarge.opendc.model.services.Service
-import com.atlarge.opendc.model.services.ServiceProvider
-import java.util.ArrayDeque
-import java.util.UUID
-
-/**
- * An isolated location within a datacenter region from which public cloud services operate, roughly equivalent to a
- * single datacenter. Zones contain one or more clusters and secondary storage.
- *
- * This class models *only* the static information of a zone, with dynamic information being contained within the zone's
- * actor. During runtime, it's actor acts as a registry for all the cloud services provided by the zone.
- *
- * @property uid The unique identifier of this availability zone
- * @property name The name of the zone within its platform.
- * @property services The initial set of services provided by the zone.
- * @property clusters The clusters of machines in this zone.
- */
-data class Zone(
- override val uid: UUID,
- override val name: String,
- val services: Set<ServiceProvider>,
- val clusters: List<Cluster>
-) : Identity {
- /**
- * Build the runtime [Behavior] of this datacenter.
- */
- operator fun invoke(): Behavior<ZoneMessage> = setup { ctx ->
- ctx.log.info("Starting zone {} [{}]", name, uid)
-
- // Launch all services of the zone
- val instances: MutableMap<Service<*>, ActorRef<*>> = mutableMapOf()
- validateDependencies(services)
-
- for (provider in services) {
- val ref = ctx.spawn(provider(this, ctx.self), name = "${provider.name}-${provider.uid}")
- ctx.watch(ref)
- provider.provides.forEach { instances[it] = ref }
- }
-
- object : ReceivingBehavior<ZoneMessage>() {
- override fun receive(ctx: ActorContext<ZoneMessage>, msg: ZoneMessage): Behavior<ZoneMessage> {
- return when (msg) {
- is ZoneMessage.Find -> {
- ctx.send(msg.replyTo, ZoneResponse.Listing(ctx.self, msg.key, instances[msg.key]))
- same()
- }
- }
- }
-
- override fun receiveSignal(ctx: ActorContext<ZoneMessage>, signal: Signal): Behavior<ZoneMessage> {
- return when (signal) {
- is Terminated -> {
- instances.values.remove(signal.ref)
- same()
- }
- else ->
- unhandled()
- }
- }
- }
- }
-
- /**
- * Validate the service for unsatisfiable dependencies.
- */
- private fun validateDependencies(providers: Set<ServiceProvider>) {
- val providersByKey = HashMap<Service<*>, ServiceProvider>()
- for (provider in providers) {
- if (provider.provides.isEmpty()) {
- throw IllegalArgumentException(("Service provider $provider does not provide any service."))
- }
- for (key in provider.provides) {
- if (key in providersByKey) {
- throw IllegalArgumentException("Multiple providers for service $key")
- }
- providersByKey[key] = provider
- }
- }
-
- val visited = HashSet<ServiceProvider>()
- val queue = ArrayDeque(providers)
- while (queue.isNotEmpty()) {
- val service = queue.poll()
- visited.add(service)
-
- for (dependencyKey in service.dependencies) {
- val dependency = providersByKey[dependencyKey]
- ?: throw IllegalArgumentException("Dependency $dependencyKey not satisfied for service $service")
- if (dependency !in visited) {
- queue.add(dependency)
- }
- }
- }
- }
-
- override fun equals(other: Any?): Boolean = other is Zone && uid == other.uid
- override fun hashCode(): Int = uid.hashCode()
-}
-
-/**
- * A reference to the actor managing the zone.
- */
-typealias ZoneRef = ActorRef<ZoneMessage>
-
-/**
- * A message protocol for communicating with the service registry
- */
-sealed class ZoneMessage {
- /**
- * Lookup the specified service in this availability zone.
- *
- * @property key The key of the service to lookup.
- * @property replyTo The address to reply to.
- */
- data class Find(
- val key: Service<*>,
- val replyTo: ActorRef<ZoneResponse.Listing>
- ) : ZoneMessage()
-}
-
-/**
- * A message protocol used by service registry actors to respond to [ZoneMessage]s.
- */
-sealed class ZoneResponse {
- /**
- * The response sent when looking up services in a zone.
- *
- * @property zone The zone from which the response originates.
- * @property key The key of the service that was looked up.
- * @property ref The reference to the service or `null` if it is not present in the zone.
- */
- data class Listing(
- val zone: ZoneRef,
- val key: Service<*>,
- private val ref: ActorRef<*>?
- ) : ZoneResponse() {
- /**
- * A flag to indicate whether the service is present.
- */
- val isPresent: Boolean
- get() = ref != null
-
- /**
- * Determine whether this listing is for the specified key.
- *
- * @param key The key to check for.
- * @return `true` if the listing is for this key, `false` otherwise.
- */
- fun isForKey(key: Service<*>): Boolean = key == this.key
-
- /**
- * Extract the result from the service lookup.
- *
- * @param key The key of the lookup.
- * @return The reference to the service or `null` if it is not present in the zone.
- */
- operator fun <T : Any> invoke(key: Service<T>): ActorRef<T>? {
- require(this.key == key) { "Invalid key" }
- @Suppress("UNCHECKED_CAST")
- return ref as? ActorRef<T>
- }
- }
-}
-
-/**
- * Find the reference to the specified [ServiceProvider].
- *
- * @param key The key of the service to find.
- * @throws IllegalArgumentException if the service is not found.
- */
-suspend fun <T : Any> ZoneRef.find(key: Service<T>): ActorRef<T> {
- val ctx = actorContext<Any>()
- val listing: ZoneResponse.Listing = ctx.ask(this) { ZoneMessage.Find(key, it) }
- return listing(key) ?: throw IllegalArgumentException("Unknown key $key")
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/Machine.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/Machine.kt
deleted file mode 100644
index 08d94e14..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/Machine.kt
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.resources.compute
-
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Behavior
-import com.atlarge.opendc.model.Identity
-import com.atlarge.opendc.model.resources.compute.supervision.MachineSupervisionEvent
-import com.atlarge.opendc.model.workload.application.Application
-import com.atlarge.opendc.model.workload.application.Pid
-
-/**
- * A generic representation of a compute node (either physical or virtual) that is able to run [Application]s.
- */
-interface Machine : Identity {
- /**
- * The details of the machine in key/value pairs.
- */
- val details: Map<String, Any>
-
- /**
- * Build the runtime [Behavior] of this compute resource, accepting messages of [MachineMessage].
- *
- * @param supervisor The supervisor of the machine.
- */
- operator fun invoke(supervisor: ActorRef<MachineSupervisionEvent>): Behavior<MachineMessage>
-}
-
-/**
- * A reference to a machine instance that accepts messages of type [MachineMessage].
- */
-typealias MachineRef = ActorRef<MachineMessage>
-
-/**
- * A message protocol for communicating with machine instances.
- */
-sealed class MachineMessage {
- /**
- * Launch the specified [Application] on the machine instance.
- *
- * @property application The application to submit.
- * @property key The key to identify this submission.
- * @property broker The broker of the process to spawn.
- */
- data class Submit(
- val application: Application,
- val key: Any,
- val broker: ActorRef<MachineEvent>
- ) : MachineMessage()
-}
-
-/**
- * A message protocol used by machine instances to respond to [MachineMessage]s.
- */
-sealed class MachineEvent {
- /**
- * Indicate that an [Application] was spawned on a machine instance.
- *
- * @property instance The machine instance to which the application was submitted.
- * @property application The application that has been submitted.
- * @property key The key used to identify the submission.
- * @property pid The spawned application instance.
- */
- data class Submitted(
- val instance: MachineRef,
- val application: Application,
- val key: Any,
- val pid: Pid
- ) : MachineEvent()
-
- /**
- * Indicate that an [Application] has terminated on the specified machine.
- *
- * @property instance The machine instance to which the application was submitted.
- * @property pid The reference to the application instance that has terminated.
- * @property status The exit code of the task, where zero means successful.
- */
- data class Terminated(
- val instance: MachineRef,
- val pid: Pid,
- val status: Int = 0
- ) : MachineEvent()
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/ProcessingUnit.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/ProcessingUnit.kt
deleted file mode 100644
index 025087a4..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/ProcessingUnit.kt
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.resources.compute
-
-/**
- * A processing unit of a compute resource, either virtual or physical.
- *
- * @property vendor The vendor string of the cpu.
- * @property family The cpu family number.
- * @property model The model number of the cpu.
- * @property modelName The name of the cpu model.
- * @property clockRate The clock speed of the cpu in MHz.
- * @property cores The number of logical cores in the cpu.
- */
-data class ProcessingUnit(
- val vendor: String,
- val family: Int,
- val model: Int,
- val modelName: String,
- val clockRate: Double,
- val cores: Int
-)
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/host/Host.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/host/Host.kt
deleted file mode 100644
index ca7ea204..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/host/Host.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.resources.compute.host
-
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.join
-import com.atlarge.odcsim.receiveMessage
-import com.atlarge.odcsim.same
-import com.atlarge.odcsim.setup
-import com.atlarge.odcsim.unhandled
-import com.atlarge.odcsim.withTimers
-import com.atlarge.opendc.model.resources.compute.Machine
-import com.atlarge.opendc.model.resources.compute.MachineMessage
-import com.atlarge.opendc.model.resources.compute.ProcessingElement
-import com.atlarge.opendc.model.resources.compute.scheduling.MachineScheduler
-import com.atlarge.opendc.model.resources.compute.supervision.MachineSupervisionEvent
-import com.atlarge.opendc.model.workload.application.Application
-import com.atlarge.opendc.model.workload.application.ProcessSupervisor
-import java.util.UUID
-
-/**
- * A physical compute node in a datacenter that is able to run [Application]s.
- *
- * @property uid The unique identifier of this machine.
- * @property name The name of the machine.
- * @property scheduler The process scheduler of this machine.
- * @property cores The list of processing elements in the machine.
- * @property details The details of this host.
- */
-data class Host(
- override val uid: UUID,
- override val name: String,
- val scheduler: MachineScheduler,
- val cores: List<ProcessingElement>,
- override val details: Map<String, Any> = emptyMap()
-) : Machine {
- /**
- * Build the [Behavior] for a physical machine.
- */
- override fun invoke(supervisor: ActorRef<MachineSupervisionEvent>): Behavior<MachineMessage> = setup { ctx ->
- ctx.send(supervisor, MachineSupervisionEvent.Announce(this, ctx.self))
- ctx.send(supervisor, MachineSupervisionEvent.Up(ctx.self))
-
- withTimers { timers ->
- val sched = scheduler(this, ctx, timers)
- sched.updateResources(cores)
- receiveMessage<Any> { msg ->
- when (msg) {
- is MachineMessage.Submit -> {
- sched.submit(msg.application, msg.key, msg.broker)
- same()
- }
- else ->
- unhandled()
- }
- }.join(ProcessSupervisor(sched).unsafeCast()).narrow()
- }
- }
-
- override fun equals(other: Any?): Boolean = other is Machine && uid == other.uid
-
- override fun hashCode(): Int = uid.hashCode()
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/MachineScheduler.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/MachineScheduler.kt
deleted file mode 100644
index de14f0fe..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/MachineScheduler.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.resources.compute.scheduling
-
-import com.atlarge.odcsim.ActorContext
-import com.atlarge.odcsim.TimerScheduler
-import com.atlarge.opendc.model.resources.compute.Machine
-import com.atlarge.opendc.model.resources.compute.MachineMessage
-
-/**
- * A factory interface for constructing a [MachineSchedulerLogic].
- */
-interface MachineScheduler {
- /**
- * Construct a [MachineSchedulerLogic] in the given [ActorContext].
- *
- * @param machine The machine to create the scheduler for.
- * @param ctx The actor context to construct a scheduler for.
- * @param scheduler The timer scheduler to use.
- */
- operator fun invoke(
- machine: Machine,
- ctx: ActorContext<MachineMessage>,
- scheduler: TimerScheduler<MachineMessage>
- ): MachineSchedulerLogic
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/MachineSchedulerLogic.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/MachineSchedulerLogic.kt
deleted file mode 100644
index 879d6ed8..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/MachineSchedulerLogic.kt
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.resources.compute.scheduling
-
-import com.atlarge.odcsim.ActorContext
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.TimerScheduler
-import com.atlarge.opendc.model.resources.compute.Machine
-import com.atlarge.opendc.model.resources.compute.MachineEvent
-import com.atlarge.opendc.model.resources.compute.MachineMessage
-import com.atlarge.opendc.model.resources.compute.ProcessingElement
-import com.atlarge.opendc.model.workload.application.Application
-import com.atlarge.opendc.model.workload.application.ProcessSupervisor
-
-/**
- * A scheduler that distributes processes over processing elements in a machine.
- *
- * @property machine The machine to create the scheduler for.
- * @property ctx The context in which the scheduler runs.
- * @property scheduler The timer scheduler to use.
- */
-abstract class MachineSchedulerLogic(
- protected val machine: Machine,
- protected val ctx: ActorContext<MachineMessage>,
- protected val scheduler: TimerScheduler<MachineMessage>
-) : ProcessSupervisor {
- /**
- * Update the available resources in the machine.
- *
- * @param cores The available processing cores for the scheduler.
- */
- abstract fun updateResources(cores: List<ProcessingElement>)
-
- /**
- * Submit the specified application for scheduling.
- *
- * @param application The application to submit.
- * @param key The key to identify the application instance.
- * @param handler The broker of this application.
- */
- abstract fun submit(application: Application, key: Any, handler: ActorRef<MachineEvent>)
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/ProcessObserver.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/ProcessObserver.kt
deleted file mode 100644
index 11262d79..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/ProcessObserver.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.resources.compute.scheduling
-
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.receiveMessage
-import com.atlarge.odcsim.same
-import com.atlarge.opendc.model.resources.compute.MachineEvent
-import com.atlarge.opendc.model.resources.compute.MachineRef
-import com.atlarge.opendc.model.workload.application.Application
-import com.atlarge.opendc.model.workload.application.Pid
-
-/**
- * An interface for observing processes.
- */
-interface ProcessObserver {
- /**
- * This method is invoked when the setup of an application completed successfully.
- *
- * @param pid The process id of the process that has been initialized.
- */
- fun onSubmission(instance: MachineRef, application: Application, key: Any, pid: Pid)
-
- /**
- * This method is invoked when a process exits.
- *
- * @property pid A reference to the application instance.
- * @property status The exit code of the task, where zero means successful.
- */
- fun onTermination(instance: MachineRef, pid: Pid, status: Int)
-
- companion object {
- /**
- * Create the [Behavior] for a [ProcessObserver].
- *
- * @param observer The observer to create the behavior for.
- */
- operator fun invoke(observer: ProcessObserver): Behavior<MachineEvent> = receiveMessage { msg ->
- when (msg) {
- is MachineEvent.Submitted -> observer.onSubmission(msg.instance, msg.application, msg.key, msg.pid)
- is MachineEvent.Terminated -> observer.onTermination(msg.instance, msg.pid, msg.status)
- }
- same()
- }
- }
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/ProcessState.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/ProcessState.kt
deleted file mode 100644
index 4c685fc4..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/ProcessState.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.resources.compute.scheduling
-
-/**
- * An enumeration of the distinct states of an application instance (process).
- */
-enum class ProcessState {
- /**
- * Default state of a process, where the task is waiting to be assigned and installed on a machine.
- */
- CREATED,
-
- /**
- * State to indicate that the process is waiting to be ran.
- */
- READY,
-
- /**
- * State to indicate that the process is currently running.
- */
- RUNNING,
-
- /**
- * State to indicate that the process has been terminated, either successfully or due to failure.
- */
- TERMINATED,
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/ProcessView.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/ProcessView.kt
deleted file mode 100644
index bc88e01f..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/ProcessView.kt
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.resources.compute.scheduling
-
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.opendc.model.resources.compute.MachineEvent
-import com.atlarge.opendc.model.workload.application.Application
-import com.atlarge.opendc.model.workload.application.Pid
-import com.atlarge.opendc.model.workload.application.ProcessMessage
-
-/**
- * A process represents a application instance running on a particular machine from the machine scheduler's point of
- * view.
- *
- * @property application The application this is an instance of.
- * @property broker The broker of the process, which is informed about its progress.
- * @property pid The reference to the application instance.
- * @property state The state of the process.
- */
-data class ProcessView(
- val application: Application,
- val broker: ActorRef<MachineEvent>,
- val pid: Pid,
- var state: ProcessState = ProcessState.CREATED
-) {
- /**
- * The slice of processing elements allocated for the process. Available as soon as the state
- * becomes [ProcessState.RUNNING]
- */
- lateinit var allocation: ProcessMessage.Allocation
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/SpaceSharedMachineScheduler.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/SpaceSharedMachineScheduler.kt
deleted file mode 100644
index 457c7070..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/scheduling/SpaceSharedMachineScheduler.kt
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.resources.compute.scheduling
-
-import com.atlarge.odcsim.ActorContext
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Instant
-import com.atlarge.odcsim.TimerScheduler
-import com.atlarge.odcsim.unsafeCast
-import com.atlarge.opendc.model.resources.compute.Machine
-import com.atlarge.opendc.model.resources.compute.MachineEvent
-import com.atlarge.opendc.model.resources.compute.MachineMessage
-import com.atlarge.opendc.model.resources.compute.ProcessingElement
-import com.atlarge.opendc.model.workload.application.Application
-import com.atlarge.opendc.model.workload.application.Pid
-import com.atlarge.opendc.model.workload.application.ProcessMessage
-import com.atlarge.opendc.model.workload.application.ProcessSupervisor
-import java.util.ArrayDeque
-import java.util.UUID
-
-/**
- * A machine scheduling policy where processes are space-shared on the machine.
- *
- * Space-sharing for machine scheduling means that all running processes will be allocated a separate set of the
- * [ProcessingElement]s in a [Machine]. Applications are scheduled on the machine in first-in-first-out (FIFO) order,
- * thus larger applications may block smaller tasks from proceeding, while space is available (no backfilling).
- *
- * @property machine The machine to create the scheduler for.
- * @property ctx The context in which the scheduler runs.
- * @property scheduler The timer scheduler to use.
- */
-class SpaceSharedMachineScheduler(
- machine: Machine,
- ctx: ActorContext<MachineMessage>,
- scheduler: TimerScheduler<MachineMessage>
-) : MachineSchedulerLogic(machine, ctx, scheduler), ProcessSupervisor {
- private var cores = 0
- private val available = ArrayDeque<ProcessingElement>()
- private val queue = ArrayDeque<ActorRef<ProcessMessage>>()
- private val running = LinkedHashSet<ActorRef<ProcessMessage>>()
- private val processes = HashMap<ActorRef<ProcessMessage>, ProcessView>()
-
- override fun updateResources(cores: List<ProcessingElement>) {
- available.addAll(cores)
- this.cores = cores.size
-
- // Add all running tasks in front of the queue
- running.reversed().forEach { queue.addFirst(it) }
- running.clear()
-
- reschedule()
- }
-
- override fun submit(application: Application, key: Any, handler: ActorRef<MachineEvent>) {
- // Create application instance on the machine
- val pid = ctx.spawn(application(), name = application.name + ":" + application.uid + ":" + UUID.randomUUID().toString())
- processes[pid] = ProcessView(application, handler, pid)
-
- // Setup the task
- ctx.send(pid, ProcessMessage.Setup(machine, ctx.self.unsafeCast()))
-
- // Inform the owner that the task has been submitted
- ctx.send(handler, MachineEvent.Submitted(ctx.self, application, key, pid))
- }
-
- /**
- * Reschedule the tasks on this machine.
- */
- private fun reschedule() {
- while (queue.isNotEmpty()) {
- val pid = queue.peek()
- val process = processes[pid]!!
-
- if (process.application.cores >= cores) {
- // The task will never fit on the machine
- // TODO Fail task
- ctx.log.warn("Process {} will not fit in machine: dropping.", process)
- queue.remove()
- return
- } else if (process.application.cores > available.size) {
- // The task will not fit at the moment
- // Try again if resources become available
- ctx.log.debug("Application queued: not enough processing elements available [requested={}, available={}]",
- process.application.cores, available.size)
- return
- }
- queue.remove()
-
- // Compute the available resources
- val resources = List(process.application.cores) {
- val pe = available.poll()
- Pair(pe, 1.0)
- }.toMap()
- process.state = ProcessState.RUNNING
- process.allocation = ProcessMessage.Allocation(resources, Instant.POSITIVE_INFINITY)
- running += pid
-
- ctx.send(pid, process.allocation)
- }
- }
-
- override fun onReady(pid: Pid) {
- val process = processes[pid]!!
-
- // Schedule the task if it has been setup
- queue.add(pid)
- process.state = ProcessState.READY
-
- reschedule()
- }
-
- override fun onConsume(pid: Pid, utilization: Map<ProcessingElement, Double>, until: Instant) {
- val process = processes[pid]!!
- val allocation = process.allocation
-
- if (until > allocation.until) {
- // Tasks are not allowed to extend allocation provided by the machine
- // TODO Fail the task
- ctx.log.warn("Task {} must not extend allocation provided by the machine", pid)
- } else if (until < allocation.until) {
- // Shrink allocation
- process.allocation = allocation.copy(until = until)
- }
-
- // Reschedule the process after the allocation expires
- scheduler.after(pid, process.allocation.until - ctx.time) {
- // We just extend the allocation
- process.allocation = process.allocation.copy(until = Instant.POSITIVE_INFINITY)
- ctx.send(pid, process.allocation)
- }
- }
-
- override fun onExit(pid: Pid, status: Int) {
- val process = processes.remove(pid)!!
- running -= pid
- scheduler.cancel(pid)
- process.allocation.resources.keys.forEach { available.add(it) }
-
- ctx.log.debug("Application {} terminated with status {}", pid, status)
-
- // Inform the owner that the task has terminated
- ctx.send(process.broker, MachineEvent.Terminated(ctx.self, pid, status))
-
- reschedule()
- }
-
- companion object : MachineScheduler {
- override fun invoke(
- machine: Machine,
- ctx: ActorContext<MachineMessage>,
- scheduler: TimerScheduler<MachineMessage>
- ): MachineSchedulerLogic {
- return SpaceSharedMachineScheduler(machine, ctx, scheduler)
- }
- }
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/supervision/MachineSupervisionEvent.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/supervision/MachineSupervisionEvent.kt
deleted file mode 100644
index 2b3fae3d..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/supervision/MachineSupervisionEvent.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.resources.compute.supervision
-
-import com.atlarge.opendc.model.resources.compute.Machine
-import com.atlarge.opendc.model.resources.compute.MachineRef
-
-/**
- * A supervision protocol for [Machine] instances.
- */
-sealed class MachineSupervisionEvent {
- /**
- * Initialization message to introduce to the supervisor a new machine by specifying its static information and
- * address.
- *
- * @property machine The machine that is being announced.
- * @property ref The address to talk to the host.
- */
- data class Announce(val machine: Machine, val ref: MachineRef) : MachineSupervisionEvent()
-
- /**
- * Indicate that the specified machine has booted up.
- *
- * @property ref The address to talk to the machine.
- */
- data class Up(val ref: MachineRef) : MachineSupervisionEvent()
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/supervision/MachineSupervisor.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/supervision/MachineSupervisor.kt
deleted file mode 100644
index c3607a22..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/resources/compute/supervision/MachineSupervisor.kt
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.resources.compute.supervision
-
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.receiveMessage
-import com.atlarge.odcsim.same
-import com.atlarge.opendc.model.resources.compute.Machine
-import com.atlarge.opendc.model.resources.compute.MachineRef
-
-/**
- * An interface for supervising [Machine] instances.
- */
-interface MachineSupervisor {
- /**
- * This method is invoked when a new machine is introduced to the supervisor by specifying its static information
- * and address.
- *
- * @param machine The machine that is being announced.
- * @param ref The address to talk to the host.
- */
- fun onAnnounce(machine: Machine, ref: MachineRef)
-
- /**
- * This method is invoked when a process exits.
- *
- * @param ref The address to talk to the machine.
- */
- fun onUp(ref: MachineRef)
-
- companion object {
- /**
- * Create the [Behavior] for a [MachineSupervisor].
- *
- * @param supervisor The supervisor to create the behavior for.
- */
- operator fun invoke(supervisor: MachineSupervisor): Behavior<MachineSupervisionEvent> = receiveMessage { msg ->
- when (msg) {
- is MachineSupervisionEvent.Announce -> supervisor.onAnnounce(msg.machine, msg.ref)
- is MachineSupervisionEvent.Up -> supervisor.onUp(msg.ref)
- }
- same()
- }
- }
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/Service.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/Service.kt
deleted file mode 100644
index e8b25b88..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/Service.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services
-
-import com.atlarge.opendc.model.Identity
-import java.util.UUID
-
-/**
- * An interface for identifying service implementations of the same type (providing the same service).
- *
- * @param T The shape of the messages the service responds to.
- */
-interface Service<T : Any> : Identity
-
-/**
- * Helper class for constructing a [Service].
- *
- * @property uid The unique identifier of the service.
- * @property name The name of the service.
- */
-abstract class AbstractService<T : Any>(override val uid: UUID, override val name: String) : Service<T> {
- override fun equals(other: Any?): Boolean = other is Service<*> && uid == other.uid
- override fun hashCode(): Int = uid.hashCode()
- override fun toString(): String = "Service[uid=$uid,name=$name]"
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/ServiceMap.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/ServiceMap.kt
deleted file mode 100644
index d91208bf..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/ServiceMap.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services
-
-import com.atlarge.odcsim.ActorRef
-
-/**
- * A map containing services.
- */
-interface ServiceMap {
- /**
- * Determine if this map contains the service with the specified [Service].
- *
- * @param key The key of the service to check for.
- * @return `true` if the service is in the map, `false` otherwise.
- */
- operator fun contains(key: Service<*>): Boolean
-
- /**
- * Obtain the service with the specified [Service].
- *
- * @param key The key of the service to obtain.
- * @return The references to the service.
- * @throws IllegalArgumentException if the key does not exists in the map.
- */
- operator fun <T : Any> get(key: Service<T>): ActorRef<T>
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/ServiceProvider.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/ServiceProvider.kt
deleted file mode 100644
index 1bf5b22e..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/ServiceProvider.kt
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services
-
-import com.atlarge.odcsim.Behavior
-import com.atlarge.opendc.model.Identity
-import com.atlarge.opendc.model.Zone
-import com.atlarge.opendc.model.ZoneRef
-import java.util.UUID
-
-/**
- * An abstract representation of a cloud service implementation provided by a cloud platform.
- */
-interface ServiceProvider : Identity {
- /**
- * The unique identifier of the service implementation.
- */
- override val uid: UUID
-
- /**
- * The name of the service implementation.
- */
- override val name: String
-
- /**
- * The set of services provided by this [ServiceProvider].
- */
- val provides: Set<Service<*>>
-
- /**
- * The dependencies of the service implementation.
- */
- val dependencies: Set<Service<*>>
-
- /**
- * Build the runtime [Behavior] for this service.
- *
- * @param zone The zone model for which the service should be build.
- * @param ref The runtime reference to the zone's actor for communication.
- */
- operator fun invoke(zone: Zone, ref: ZoneRef): Behavior<*>
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/provisioning/ProvisioningService.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/provisioning/ProvisioningService.kt
deleted file mode 100644
index 22b70f35..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/provisioning/ProvisioningService.kt
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.provisioning
-
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.opendc.model.Zone
-import com.atlarge.opendc.model.services.AbstractService
-import com.atlarge.opendc.model.services.Service
-import com.atlarge.opendc.model.services.ServiceProvider
-import com.atlarge.opendc.model.services.resources.HostView
-import java.util.UUID
-
-/**
- * A cloud platform service that provisions the native resources on the platform.
- *
- * This service assumes control over all hosts in its [Zone].
- */
-abstract class ProvisioningService : ServiceProvider {
- override val provides: Set<Service<*>> = setOf(ProvisioningService)
-
- /**
- * The service key of the provisioner service.
- */
- companion object : AbstractService<ProvisioningMessage>(UUID.randomUUID(), "provisioner")
-}
-
-/**
- * A message protocol for communicating to the resource provisioner.
- */
-sealed class ProvisioningMessage {
- /**
- * Request the specified number of resources from the provisioner.
- *
- * @property numHosts The number of hosts to request from the provisioner.
- * @property replyTo The actor to reply to.
- */
- data class Request(val numHosts: Int, val replyTo: ActorRef<ProvisioningResponse.Lease>) : ProvisioningMessage()
-
- /**
- * Release the specified resource [ProvisioningResponse.Lease].
- *
- * @property lease The lease to release.
- */
- data class Release(val lease: ProvisioningResponse.Lease) : ProvisioningMessage()
-}
-
-/**
- * A message protocol used by the resource provisioner to respond to [ProvisioningMessage]s.
- */
-sealed class ProvisioningResponse {
- /**
- * A lease for the specified hosts.
- */
- data class Lease(val hosts: List<HostView>) : ProvisioningResponse()
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/provisioning/SimpleProvisioningService.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/provisioning/SimpleProvisioningService.kt
deleted file mode 100644
index 1ddc1b69..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/provisioning/SimpleProvisioningService.kt
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.provisioning
-
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.StashBuffer
-import com.atlarge.odcsim.receiveMessage
-import com.atlarge.odcsim.same
-import com.atlarge.odcsim.setup
-import com.atlarge.odcsim.unhandled
-import com.atlarge.odcsim.unsafeCast
-import com.atlarge.opendc.model.Zone
-import com.atlarge.opendc.model.ZoneMessage
-import com.atlarge.opendc.model.ZoneRef
-import com.atlarge.opendc.model.ZoneResponse
-import com.atlarge.opendc.model.resources.compute.MachineRef
-import com.atlarge.opendc.model.services.Service
-import com.atlarge.opendc.model.services.resources.HostView
-import com.atlarge.opendc.model.services.resources.ResourceManagementMessage
-import com.atlarge.opendc.model.services.resources.ResourceManagementResponse
-import com.atlarge.opendc.model.services.resources.ResourceManagementService
-import com.atlarge.opendc.model.services.resources.ResourceManagerRef
-import java.util.ArrayDeque
-import java.util.UUID
-
-/**
- * A cloud platform service that provisions the native resources on the platform.
- *
- * This service assumes control over all hosts in its [Zone].
- */
-object SimpleProvisioningService : ProvisioningService() {
- override val uid: UUID = UUID.randomUUID()
- override val name: String = "simple-provisioner"
- override val dependencies: Set<Service<*>> = setOf(ResourceManagementService)
-
- /**
- * Build the runtime [Behavior] for the resource provisioner, responding to messages of shape [ProvisioningMessage].
- */
- override fun invoke(zone: Zone, ref: ZoneRef): Behavior<ProvisioningMessage> = setup { ctx ->
- val buffer = StashBuffer<Any>(capacity = 30)
- ctx.send(ref, ZoneMessage.Find(ResourceManagementService, ctx.self.unsafeCast()))
-
- receiveMessage<Any> { msg ->
- when (msg) {
- is ZoneResponse.Listing -> {
- val service = msg(ResourceManagementService) ?: throw IllegalStateException("Resource management service not available")
- buffer.unstashAll(ctx.unsafeCast(), active(zone, service).unsafeCast())
- }
- else -> {
- buffer.stash(msg)
- same()
- }
- }
- }.narrow()
- }
-
- private fun active(zone: Zone, manager: ResourceManagerRef) = setup<ProvisioningMessage> { ctx ->
- val hosts = mutableMapOf<MachineRef, HostView>()
- val available = ArrayDeque<HostView>()
- val leases = mutableSetOf<ProvisioningResponse.Lease>()
-
- // Subscribe to all machines in the zone
- for (cluster in zone.clusters) {
- for (host in cluster.hosts) {
- ctx.send(manager, ResourceManagementMessage.Lookup(host, ctx.self.unsafeCast()))
- }
- }
-
- receiveMessage<Any> { msg ->
- when (msg) {
- is ProvisioningMessage.Request -> {
- ctx.log.info("Provisioning {} hosts", msg.numHosts)
- val leaseHosts = mutableListOf<HostView>()
- while (available.isNotEmpty() && leaseHosts.size < msg.numHosts) {
- leaseHosts += available.poll()
- }
- val lease = ProvisioningResponse.Lease(leaseHosts)
- leases += lease
- ctx.send(msg.replyTo, lease)
- same()
- }
- is ProvisioningMessage.Release -> {
- val lease = msg.lease
- if (lease in leases) {
- return@receiveMessage same()
- }
- available.addAll(lease.hosts)
- leases -= lease
- same()
- }
- is ResourceManagementResponse.Listing -> {
- if (msg.instance != null) {
- hosts[msg.instance.ref] = msg.instance
- available.add(msg.instance)
- }
- same()
- }
- else ->
- unhandled()
- }
- }.narrow()
- }
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/resources/HostView.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/resources/HostView.kt
deleted file mode 100644
index 943461cd..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/resources/HostView.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.resources
-
-import com.atlarge.opendc.model.resources.compute.MachineRef
-import com.atlarge.opendc.model.resources.compute.MachineStatus
-import com.atlarge.opendc.model.resources.compute.host.Host
-
-/**
- * The dynamic information of a [Host] instance that is being tracked by the [ResourceManagementService]. This means
- * that information may not be up-to-date.
- *
- * @property host The static information of the host.
- * @property ref The reference to the host's actor.
- * @property status The status of the machine.
- */
-data class HostView(val host: Host, val ref: MachineRef, val status: MachineStatus = MachineStatus.HALT) {
- override fun equals(other: Any?): Boolean = other is HostView && host.uid == other.host.uid
- override fun hashCode(): Int = host.uid.hashCode()
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/resources/ResourceManagementService.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/resources/ResourceManagementService.kt
deleted file mode 100644
index 5e38c6da..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/services/resources/ResourceManagementService.kt
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.resources
-
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.receiveMessage
-import com.atlarge.odcsim.same
-import com.atlarge.odcsim.setup
-import com.atlarge.odcsim.unhandled
-import com.atlarge.opendc.model.Zone
-import com.atlarge.opendc.model.ZoneRef
-import com.atlarge.opendc.model.resources.compute.MachineRef
-import com.atlarge.opendc.model.resources.compute.MachineStatus
-import com.atlarge.opendc.model.resources.compute.host.Host
-import com.atlarge.opendc.model.resources.compute.supervision.MachineSupervisionEvent
-import com.atlarge.opendc.model.services.Service
-import com.atlarge.opendc.model.services.ServiceProvider
-import java.util.UUID
-
-/**
- * A cloud platform service that manages the native resources on the platform.
- *
- * This service assumes control over all hosts in its [Zone].
- */
-object ResourceManagementService : ServiceProvider, Service<ResourceManagementMessage> {
- override val uid: UUID = UUID.randomUUID()
- override val name: String = "resource-manager"
- override val provides: Set<Service<*>> = setOf(ResourceManagementService)
- override val dependencies: Set<Service<*>> = emptySet()
-
- /**
- * Build the runtime behavior of the [ResourceManagementService].
- */
- override fun invoke(zone: Zone, ref: ZoneRef): Behavior<ResourceManagementMessage> = setup { ctx ->
- // Launch the clusters of the zone
- for (cluster in zone.clusters) {
- ctx.spawn(cluster(ctx.self), name = "${cluster.name}-${cluster.uid}")
- }
-
- val hosts = mutableMapOf<MachineRef, HostView>()
- receiveMessage<Any> { msg ->
- when (msg) {
- is MachineSupervisionEvent.Announce -> {
- val host = msg.machine as? Host
- if (host != null) {
- hosts[msg.ref] = HostView(host, msg.ref)
- }
- same()
- }
- is MachineSupervisionEvent.Up -> {
- hosts.computeIfPresent(msg.ref) { _, value ->
- value.copy(status = MachineStatus.RUNNING)
- }
- same()
- }
- is ResourceManagementMessage.Lookup -> {
- ctx.send(msg.replyTo, ResourceManagementResponse.Listing(hosts.values.find { it.host == msg.host }))
- same()
- }
- else ->
- unhandled()
- }
- }.narrow()
- }
-}
-
-/**
- * A reference to the resource manager of a zone.
- */
-typealias ResourceManagerRef = ActorRef<ResourceManagementMessage>
-
-/**
- * A message protocol for communicating to the resource manager.
- */
-sealed class ResourceManagementMessage {
- /**
- * Lookup the specified [Host].
- *
- * @property host The host to lookup.
- * @property replyTo The address to sent the response to.
- */
- data class Lookup(
- val host: Host,
- val replyTo: ActorRef<ResourceManagementResponse.Listing>
- ) : ResourceManagementMessage()
-}
-
-/**
- * A message protocol used by the resource manager to respond to [ResourceManagementMessage]s.
- */
-sealed class ResourceManagementResponse {
- /**
- * A response to a [ResourceManagementMessage.Lookup] request.
- *
- * @property instance The instance that was found or `null` if it does not exist.
- */
- data class Listing(val instance: HostView?) : ResourceManagementResponse()
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/Workload.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/Workload.kt
deleted file mode 100644
index c1215715..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/Workload.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.workload
-
-import com.atlarge.opendc.model.Identity
-import com.atlarge.opendc.model.User
-
-/**
- * A high-level abstraction that represents the actual work that a set of compute resources perform, such
- * as running an application on a machine or a whole workflow running multiple tasks on numerous machines.
- */
-interface Workload : Identity {
- /**
- * The owner of this workload.
- */
- val owner: User
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/Application.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/Application.kt
deleted file mode 100644
index 00ab98b6..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/Application.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.workload.application
-
-import com.atlarge.odcsim.Behavior
-import com.atlarge.opendc.model.workload.Workload
-
-/**
- * A generic representation of a workload that can directly be executed by physical or virtual compute resources,
- * such as a web server application.
- */
-interface Application : Workload {
- /**
- * The number of processing elements required by the task.
- */
- val cores: Int
-
- /**
- * Build the runtime [Behavior] of an application, accepting messages of [ProcessMessage].
- *
- * This is a model for the runtime behavior of an application instance (process) that describes how an application
- * instance consumes the allocated resources on a machine.
- */
- operator fun invoke(): Behavior<ProcessMessage>
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/FlopsApplication.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/FlopsApplication.kt
deleted file mode 100644
index 60a896d4..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/FlopsApplication.kt
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.workload.application
-
-import com.atlarge.odcsim.ActorContext
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.DeferredBehavior
-import com.atlarge.odcsim.Instant
-import com.atlarge.odcsim.receive
-import com.atlarge.odcsim.stopped
-import com.atlarge.odcsim.unhandled
-import com.atlarge.opendc.model.User
-import com.atlarge.opendc.model.resources.compute.Machine
-import com.atlarge.opendc.model.resources.compute.ProcessingElement
-import java.lang.Double.min
-import java.util.UUID
-import kotlin.math.ceil
-
-/**
- * An [Application] implementation that models applications performing a static number of floating point operations
- * ([flops]) on a compute resource.
- *
- * @property uid A unique identifier for this application.
- * @property name The name of the application.
- * @property owner The owner of this application.
- * @property cores The number of cores needed for this application.
- * @property flops The number of floating point operations to perform for this task.
- */
-class FlopsApplication(
- override val uid: UUID,
- override val name: String,
- override val owner: User,
- override val cores: Int,
- val flops: Long
-) : Application {
-
- init {
- require(flops >= 0) { "Negative number of flops" }
- }
-
- /**
- * Build the runtime [Behavior] based on a number of floating point operations to execute.
- */
- override fun invoke(): Behavior<ProcessMessage> = object : DeferredBehavior<ProcessMessage>() {
- /**
- * The remaining number of floating point operations to execute.
- */
- var remaining = flops
-
- /**
- * The machine to which the task is assigned.
- */
- lateinit var machine: Machine
-
- /**
- * The reference to the machine instance.
- */
- lateinit var ref: ActorRef<ProcessEvent>
-
- /**
- * The start of the last allocation
- */
- var start: Instant = 0.0
-
- /**
- * The given resource allocation.
- */
- lateinit var allocation: Map<ProcessingElement, Double>
-
- override fun invoke(ctx: ActorContext<ProcessMessage>) = created()
-
- /**
- * Handle the initial, created state of a task instance.
- */
- private fun created(): Behavior<ProcessMessage> = receive { ctx, msg ->
- when (msg) {
- is ProcessMessage.Setup -> {
- machine = msg.machine
- ref = msg.ref
- /* TODO implement setup time */
- ctx.send(ref, ProcessEvent.Ready(ctx.self))
- ready().narrow()
- }
- else -> unhandled()
- }
- }
-
- /**
- * Handle the ready state of a task instance.
- */
- private fun ready(): Behavior<Any> = receive { ctx, msg ->
- when (msg) {
- is ProcessMessage.Allocation -> {
- processAllocation(ctx, msg.resources, msg.until)
- running()
- }
- else -> unhandled()
- }
- }
-
- /**
- * Handle the running state of a task instance.
- */
- private fun running(): Behavior<Any> = receive { ctx, msg ->
- when (msg) {
- is ProcessMessage.Allocation -> {
- /* Compute the consumption of flops */
- val consumed = allocation.asSequence()
- .map { (key, value) -> key.unit.clockRate * value * (ctx.time - start) }
- .sum()
- // Ceil to prevent consumed flops being rounded to 0
- remaining -= ceil(consumed).toLong()
-
- /* Test whether all flops have been consumed and the task is finished */
- if (remaining <= 0) {
- ctx.send(ref, ProcessEvent.Exit(ctx.self, 0))
- return@receive stopped()
- }
-
- processAllocation(ctx, msg.resources, msg.until)
- running().narrow()
- }
- else -> unhandled()
- }
- }
-
- private fun processAllocation(ctx: ActorContext<Any>, resources: Map<ProcessingElement, Double>, until: Instant) {
- start = ctx.time
- allocation = resources
- .asSequence()
- .take(cores)
- .associateBy({ it.key }, { it.value })
-
- val speed = allocation.asSequence()
- .map { (key, value) -> key.unit.clockRate * value }
- .average()
- val finishedAt = ctx.time + remaining / speed
- ctx.send(ref, ProcessEvent.Consume(ctx.self, allocation, min(finishedAt, until)))
- }
- }
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/Process.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/Process.kt
deleted file mode 100644
index a78b8572..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/Process.kt
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.workload.application
-
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Instant
-import com.atlarge.opendc.model.resources.compute.Machine
-import com.atlarge.opendc.model.resources.compute.ProcessingElement
-
-/**
- * The process id (pid) is a reference to the application instance (process) that accepts messages of
- * type [ProcessMessage].
- */
-typealias Pid = ActorRef<ProcessMessage>
-
-/**
- * A message protocol for actors to communicate with task instances (called processes).
- */
-sealed class ProcessMessage {
- /**
- * Indicate that the task should be installed to the specified machine.
- *
- * @property machine The machine to install the task.
- * @property ref The reference to the machine instance.
- */
- data class Setup(val machine: Machine, val ref: ActorRef<ProcessEvent>) : ProcessMessage()
-
- /**
- * Indicate an allocation of compute resources on a machine for a certain duration.
- * The task may assume that the reservation occurs after installation on the same machine.
- *
- * @property resources The cpu cores (and the utilization percentages) allocated for the task.
- * @property until The point in time till which the reservation is valid.
- */
- data class Allocation(val resources: Map<ProcessingElement, Double>, val until: Instant) : ProcessMessage()
-}
-
-/**
- * The message protocol used by application instances respond to [ProcessMessage]s.
- */
-sealed class ProcessEvent {
- /**
- * Indicate that the process is ready to start processing.
- *
- * @property pid A reference to the application instance.
- */
- data class Ready(val pid: Pid) : ProcessEvent()
-
- /**
- * Indicate the estimated resource utilization of the task until a specified point in time.
- *
- * @property pid A reference to the application instance of the represented utilization.
- * @property utilization The utilization of the cpu cores as a percentage.
- * @property until The point in time until which the utilization is valid.
- */
- data class Consume(
- val pid: Pid,
- val utilization: Map<ProcessingElement, Double>,
- val until: Instant
- ) : ProcessEvent()
-
- /**
- * Indicate that a process has been terminated.
- *
- * @property pid A reference to the application instance.
- * @property status The exit code of the task, where zero means successful.
- */
- data class Exit(val pid: Pid, val status: Int) : ProcessEvent()
-}
diff --git a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/ProcessSupervisor.kt b/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/ProcessSupervisor.kt
deleted file mode 100644
index 2952c82e..00000000
--- a/opendc-core/src/main/kotlin/com/atlarge/opendc/model/workload/application/ProcessSupervisor.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.workload.application
-
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.Instant
-import com.atlarge.odcsim.receiveMessage
-import com.atlarge.odcsim.same
-import com.atlarge.opendc.model.resources.compute.ProcessingElement
-
-/**
- * An interface for supervising processes.
- */
-interface ProcessSupervisor {
- /**
- * This method is invoked when the setup of an application completed successfully.
- *
- * @param pid The process id of the process that has been initialized.
- */
- fun onReady(pid: Pid) {}
-
- /**
- * This method is invoked when a process informs the machine that it is running with the
- * estimated resource utilization until a specified point in time.
- *
- * @param pid The process id of the process that is running.
- * @param utilization The utilization of the cpu cores as a percentage.
- * @param until The point in time until which the utilization is valid.
- */
- fun onConsume(pid: Pid, utilization: Map<ProcessingElement, Double>, until: Instant) {}
-
- /**
- * This method is invoked when a process exits.
- *
- * @property pid A reference to the application instance.
- * @property status The exit code of the task, where zero means successful.
- */
- fun onExit(pid: Pid, status: Int) {}
-
- companion object {
- /**
- * Create the [Behavior] for a [ProcessSupervisor].
- *
- * @param supervisor The supervisor to create the behavior for.
- */
- operator fun invoke(supervisor: ProcessSupervisor): Behavior<ProcessEvent> {
- return receiveMessage { msg ->
- when (msg) {
- is ProcessEvent.Ready -> supervisor.onReady(msg.pid)
- is ProcessEvent.Consume -> supervisor.onConsume(msg.pid, msg.utilization, msg.until)
- is ProcessEvent.Exit -> supervisor.onExit(msg.pid, msg.status)
- }
- same()
- }
- }
- }
-}
diff --git a/opendc-core/src/test/kotlin/com/atlarge/opendc/model/workload/application/FlopsApplicationTest.kt b/opendc-core/src/test/kotlin/com/atlarge/opendc/model/workload/application/FlopsApplicationTest.kt
deleted file mode 100644
index 2cde1b6f..00000000
--- a/opendc-core/src/test/kotlin/com/atlarge/opendc/model/workload/application/FlopsApplicationTest.kt
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.workload.application
-
-import com.atlarge.odcsim.testkit.BehaviorTestKit
-import com.atlarge.opendc.model.User
-import com.atlarge.opendc.model.resources.compute.Machine
-import com.atlarge.opendc.model.resources.compute.ProcessingElement
-import com.atlarge.opendc.model.resources.compute.ProcessingUnit
-import com.nhaarman.mockitokotlin2.mock
-import org.junit.jupiter.api.Assertions.assertFalse
-import org.junit.jupiter.api.Assertions.assertTrue
-import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.DisplayName
-import org.junit.jupiter.api.Test
-import java.util.UUID
-
-/**
- * A test suite for the [FlopsApplication].
- */
-@DisplayName("FlopsApplication")
-internal class FlopsApplicationTest {
- private val flops = 10000L
- private val cores = 2
- private val machine: Machine = mock()
- private val user: User = mock()
- private val cpu: ProcessingUnit = ProcessingUnit("Intel", 6, 8600, "Intel(R) Core(TM) i7-6920HQ CPU @ 2.90GHz", 2900.0, 1)
-
- private lateinit var application: FlopsApplication
-
- @BeforeEach
- fun setUp() {
- application = FlopsApplication(UUID.randomUUID(), "java", user, cores, flops)
- }
-
- @Test
- fun `should become ready after triggering installation`() {
- val test = BehaviorTestKit(application())
- val inbox = test.createInbox<ProcessEvent>()
- test.run(ProcessMessage.Setup(machine, inbox.ref))
- inbox.expectMessage(ProcessEvent.Ready(test.ref))
- }
-
- @Test
- fun `should not respond to setup request after being created`() {
- val test = BehaviorTestKit(application())
- val inbox = test.createInbox<ProcessEvent>()
-
- // Setup Machine
- test.run(ProcessMessage.Setup(machine, inbox.ref))
- inbox.clear()
-
- // Try again
- assertFalse(test.run(ProcessMessage.Setup(machine, inbox.ref)))
- }
-
- @Test
- fun `should respond to allocation with consumption`() {
- val test = BehaviorTestKit(application())
- val inbox = test.createInbox<ProcessEvent>()
-
- val allocation = ProcessMessage.Allocation(mapOf(ProcessingElement(0, cpu) to 0.5), until = 10.0)
-
- // Setup Machine
- test.run(ProcessMessage.Setup(machine, inbox.ref))
- inbox.clear()
-
- // Test allocation
- test.run(allocation)
- val msg = inbox.receiveMessage()
- assertTrue(msg is ProcessEvent.Consume)
- }
-
- @Test
- fun `should inform the machine that it finished processing`() {
- val test = BehaviorTestKit(application())
- val inbox = test.createInbox<ProcessEvent>()
- val allocation = ProcessMessage.Allocation(mapOf(ProcessingElement(0, cpu) to 0.5), until = 10.0)
-
- // Setup
- test.run(ProcessMessage.Setup(machine, inbox.ref))
- test.run(allocation)
- test.runTo(10.0)
- inbox.clear()
-
- test.run(allocation)
- inbox.expectMessage(ProcessEvent.Exit(test.ref, 0))
- }
-
- @Test
- fun `should be able to update its utilization`() {
- val test = BehaviorTestKit(application())
- val inbox = test.createInbox<ProcessEvent>()
- val allocation1 = ProcessMessage.Allocation(mapOf(ProcessingElement(0, cpu) to 0.5), until = 10.0)
- val allocation2 = ProcessMessage.Allocation(mapOf(ProcessingElement(0, cpu) to 0.25), until = 10.0)
-
- // Setup
- test.run(ProcessMessage.Setup(machine, inbox.ref))
- test.run(allocation1)
- test.runTo(5.0)
- inbox.clear()
-
- test.run(allocation2)
- assertTrue(inbox.receiveMessage() is ProcessEvent.Consume)
- }
-}
diff --git a/opendc-experiments-tpds/src/main/kotlin/com/atlarge/opendc/experiments/tpds/TestExperiment.kt b/opendc-experiments-tpds/src/main/kotlin/com/atlarge/opendc/experiments/tpds/TestExperiment.kt
deleted file mode 100644
index ad302889..00000000
--- a/opendc-experiments-tpds/src/main/kotlin/com/atlarge/opendc/experiments/tpds/TestExperiment.kt
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.experiments.tpds
-
-import com.atlarge.odcsim.ActorContext
-import com.atlarge.odcsim.ActorSystemFactory
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.TimerScheduler
-import com.atlarge.odcsim.coroutines.suspending
-import com.atlarge.odcsim.receiveMessage
-import com.atlarge.odcsim.same
-import com.atlarge.odcsim.stopped
-import com.atlarge.odcsim.unhandled
-import com.atlarge.odcsim.withTimers
-import com.atlarge.opendc.format.environment.sc18.Sc18EnvironmentReader
-import com.atlarge.opendc.format.trace.gwf.GwfTraceReader
-import com.atlarge.opendc.model.Broker
-import com.atlarge.opendc.model.Model
-import com.atlarge.opendc.model.PlatformRef
-import com.atlarge.opendc.model.find
-import com.atlarge.opendc.model.services.provisioning.SimpleProvisioningService
-import com.atlarge.opendc.model.services.resources.ResourceManagementService
-import com.atlarge.opendc.model.services.workflows.StageWorkflowScheduler
-import com.atlarge.opendc.model.services.workflows.WorkflowEvent
-import com.atlarge.opendc.model.services.workflows.WorkflowMessage
-import com.atlarge.opendc.model.services.workflows.WorkflowSchedulerMode
-import com.atlarge.opendc.model.services.workflows.WorkflowService
-import com.atlarge.opendc.model.services.workflows.stages.job.FifoJobSortingPolicy
-import com.atlarge.opendc.model.services.workflows.stages.job.NullJobAdmissionPolicy
-import com.atlarge.opendc.model.services.workflows.stages.resources.FirstFitResourceSelectionPolicy
-import com.atlarge.opendc.model.services.workflows.stages.resources.FunctionalResourceDynamicFilterPolicy
-import com.atlarge.opendc.model.services.workflows.stages.task.FifoTaskSortingPolicy
-import com.atlarge.opendc.model.services.workflows.stages.task.FunctionalTaskEligibilityPolicy
-import com.atlarge.opendc.model.workload.workflow.Job
-import com.atlarge.opendc.model.zones
-import java.io.File
-import java.util.ServiceLoader
-import kotlin.math.max
-
-/**
- * Main entry point of the experiment.
- */
-fun main(args: Array<String>) {
- if (args.isEmpty()) {
- println("error: Please provide path to GWF trace")
- return
- }
-
-
- val scheduler = StageWorkflowScheduler(
- mode = WorkflowSchedulerMode.Batch(100.0),
- jobAdmissionPolicy = NullJobAdmissionPolicy,
- jobSortingPolicy = FifoJobSortingPolicy(),
- taskEligibilityPolicy = FunctionalTaskEligibilityPolicy(),
- taskSortingPolicy = FifoTaskSortingPolicy(),
- resourceDynamicFilterPolicy = FunctionalResourceDynamicFilterPolicy(),
- resourceSelectionPolicy = FirstFitResourceSelectionPolicy()
- )
-
- val environment = Sc18EnvironmentReader(object {}.javaClass.getResourceAsStream("/env/setup-test.json"))
- .use { it.read() }
- .let { env ->
- env.copy(platforms = env.platforms.map { platform ->
- platform.copy(zones = platform.zones.map { zone ->
- val services = zone.services + setOf(ResourceManagementService, SimpleProvisioningService, WorkflowService(scheduler))
- zone.copy(services = services)
- })
- })
- }
-
- val broker = object : Broker {
- override fun invoke(platforms: List<PlatformRef>): Behavior<*> = suspending<Any> { ctx ->
- val zones = platforms.first().zones()
- val service = zones.values.first().find(WorkflowService)
-
- val activeJobs = mutableSetOf<Job>()
- val reader = GwfTraceReader(File(args[0]))
-
- fun submitNext(ctx: ActorContext<Any>, timers: TimerScheduler<Any>) {
- if (!reader.hasNext()) {
- return
- }
-
- val (time, job) = reader.next()
- timers.after(job, max(.0, time - ctx.time)) {
- ctx.send(service, WorkflowMessage.Submit(job, ctx.self))
- submitNext(ctx, timers)
- }
- }
-
- var total = 0
- var finished = 0
-
- withTimers { timers ->
- submitNext(ctx, timers)
- receiveMessage { msg ->
- when (msg) {
- is WorkflowEvent.JobSubmitted -> {
- ctx.log.info("Job {} submitted", msg.job.uid)
- total += 1
- same()
- }
- is WorkflowEvent.JobStarted -> {
- activeJobs += msg.job
- same()
- }
- is WorkflowEvent.JobFinished -> {
- activeJobs -= msg.job
- finished += 1
- ctx.log.info("Jobs {}/{} finished ({} tasks)", finished, total, msg.job.tasks.size)
- if (activeJobs.isEmpty()) stopped() else same()
- }
- else ->
- unhandled()
- }
- }
- }
- }
- }
-
- val model = Model(environment, listOf(broker))
- val factory = ServiceLoader.load(ActorSystemFactory::class.java).first()
- val system = factory(model(), name = "sim")
- system.run()
- system.terminate()
-}
diff --git a/opendc-experiments-tpds/src/main/resources/env/setup-test.json b/opendc-experiments-tpds/src/main/resources/env/setup-test.json
deleted file mode 100644
index 0965b250..00000000
--- a/opendc-experiments-tpds/src/main/resources/env/setup-test.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "Experimental Setup 2",
- "rooms": [
- {
- "type": "SERVER",
- "objects": [
- {
- "type": "RACK",
- "machines": [
- { "cpus": [2] }, { "cpus": [2]},
- { "cpus": [2] }, { "cpus": [2]},
- { "cpus": [2] }, { "cpus": [2]},
- { "cpus": [2] }, { "cpus": [2]},
- { "cpus": [2] }, { "cpus": [2]},
- { "cpus": [2] }, { "cpus": [2]},
- { "cpus": [2] }, { "cpus": [2]},
- { "cpus": [2] }, { "cpus": [2]}
- ]
- },
- {
- "type": "RACK",
- "machines": [
- { "cpus": [1] }, { "cpus": [1]},
- { "cpus": [1] }, { "cpus": [1]},
- { "cpus": [1] }, { "cpus": [1]},
- { "cpus": [1] }, { "cpus": [1]},
- { "cpus": [1] }, { "cpus": [1]},
- { "cpus": [1] }, { "cpus": [1]},
- { "cpus": [1] }, { "cpus": [1]},
- { "cpus": [1] }, { "cpus": [1]}
- ]
- }
- ]
- }
- ]
-}
diff --git a/opendc-experiments-tpds/src/main/resources/log4j2.xml b/opendc-experiments-tpds/src/main/resources/log4j2.xml
deleted file mode 100644
index 67bf34ab..00000000
--- a/opendc-experiments-tpds/src/main/resources/log4j2.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ MIT License
- ~
- ~ Copyright (c) 2019 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 status="WARN">
- <Appenders>
- <Console name="Console" target="SYSTEM_ERR">
- <PatternLayout pattern="%d{HH:mm:ss.SSS} [%X{actor.time}] %level %msg%n" />
- </Console>
- <File name="File" fileName="data/opendc.log" append="false">
- <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%X{actor.time}] %-5level %X{actor.ref} - %msg%n"/>
- </File>
- </Appenders>
- <Loggers>
- <Logger name="com.atlarge.odcsim" level="info" additivity="false">
- <AppenderRef ref="Console" level="info" />
- <AppenderRef ref="File" level="info" />
- </Logger>
-
- <!-- Experiment runner can log on INFO level -->
- <Logger name="com.atlarge.opendc.experiments.tpds" level="debug" additivity="false">
- <AppenderRef ref="Console" level="info" />
- <AppenderRef ref="File" level="debug" />
- </Logger>
-
- <Root level="error">
- <AppenderRef ref="Console" />
- <AppenderRef ref="File" />
- </Root>
- </Loggers>
-</Configuration>
diff --git a/opendc-format-gwf/build.gradle.kts b/opendc-format-gwf/build.gradle.kts
deleted file mode 100644
index caf86c0c..00000000
--- a/opendc-format-gwf/build.gradle.kts
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2018 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.
- */
-
-/* Build configuration */
-apply(from = "../gradle/kotlin.gradle")
-plugins {
- `java-library`
-}
-
-/* Project configuration */
-repositories {
- jcenter()
-}
-
-val junitJupiterVersion: String by extra
-val junitPlatformVersion: String by extra
-
-dependencies {
- api(project(":opendc-core"))
- api(project(":opendc-format"))
- api(project(":opendc-workflows"))
- implementation(kotlin("stdlib"))
-
- testImplementation("org.junit.jupiter:junit-jupiter-api:$junitJupiterVersion")
- testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$junitJupiterVersion")
- testImplementation("org.junit.platform:junit-platform-launcher:$junitPlatformVersion")
-}
diff --git a/opendc-format-gwf/src/main/kotlin/com/atlarge/opendc/format/trace/gwf/GwfTraceReader.kt b/opendc-format-gwf/src/main/kotlin/com/atlarge/opendc/format/trace/gwf/GwfTraceReader.kt
deleted file mode 100644
index df6a4b11..00000000
--- a/opendc-format-gwf/src/main/kotlin/com/atlarge/opendc/format/trace/gwf/GwfTraceReader.kt
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.format.trace.gwf
-
-import com.atlarge.odcsim.Instant
-import com.atlarge.opendc.format.trace.TraceEntry
-import com.atlarge.opendc.format.trace.TraceReader
-import com.atlarge.opendc.model.User
-import com.atlarge.opendc.model.workload.application.FlopsApplication
-import com.atlarge.opendc.model.workload.workflow.Job
-import com.atlarge.opendc.model.workload.workflow.Task
-import java.io.BufferedReader
-import java.io.File
-import java.io.InputStream
-import java.util.UUID
-import kotlin.math.max
-import kotlin.math.min
-
-/**
- * A [TraceReader] for the Grid Workload Format. See the Grid Workloads Archive (http://gwa.ewi.tudelft.nl/) for more
- * information about the format.
- *
- * Be aware that in the Grid Workload Format, workflows are not required to be ordered by submission time and therefore
- * this reader needs to read the whole trace into memory before an entry can be read. Consider converting the trace to a
- * different format for better performance.
- *
- * @param reader The buffered reader to read the trace with.
- */
-class GwfTraceReader(reader: BufferedReader) : TraceReader<Job> {
- /**
- * The internal iterator to use for this reader.
- */
- private val iterator: Iterator<TraceEntry<Job>>
-
- /**
- * Create a [GwfTraceReader] instance from the specified [File].
- *
- * @param file The file to read from.
- */
- constructor(file: File) : this(file.bufferedReader())
-
- /**
- * Create a [GwfTraceReader] instance from the specified [InputStream].
- *
- * @param input The input stream to read from.
- */
- constructor(input: InputStream) : this(input.bufferedReader())
-
- /**
- * Initialize the reader.
- */
- init {
- val entries = mutableMapOf<Long, TraceEntryImpl>()
- val tasks = mutableMapOf<Long, Task>()
- val taskDependencies = mutableMapOf<Task, List<Long>>()
-
- var workflowIdCol = 0
- var taskIdCol = 0
- var submitTimeCol = 0
- var runtimeCol = 0
- var coreCol = 0
- var dependencyCol = 0
-
- try {
- reader.lineSequence()
- .filter { line ->
- // Ignore comments in the trace
- !line.startsWith("#") && line.isNotBlank()
- }
- .forEachIndexed { idx, line ->
- val values = line.split(",")
-
- // Parse GWF header
- if (idx == 0) {
- val header = values.mapIndexed { col, name -> Pair(name.trim(), col) }.toMap()
- workflowIdCol = header["WorkflowID"]!!
- taskIdCol = header["JobID"]!!
- submitTimeCol = header["SubmitTime"]!!
- runtimeCol = header["RunTime"]!!
- coreCol = header["NProcs"]!!
- dependencyCol = header["Dependencies"]!!
- return@forEachIndexed
- }
-
- val workflowId = values[workflowIdCol].trim().toLong()
- val taskId = values[taskIdCol].trim().toLong()
- val submitTime = values[submitTimeCol].trim().toDouble()
- val runtime = max(0, values[runtimeCol].trim().toLong())
- val cores = values[coreCol].trim().toInt()
- val dependencies = values[dependencyCol].split(" ")
- .filter { it.isNotEmpty() }
- .map { it.trim().toLong() }
-
- val flops: Long = 4000 * runtime * cores
-
- val entry = entries.getOrPut(workflowId) {
- TraceEntryImpl(submitTime, Job(UUID(0L, taskId), "<unnamed>", UnnamedUser, HashSet()))
- }
- val workflow = entry.workload
- val task = Task(
- UUID(0L, taskId), "<unnamed>",
- FlopsApplication(UUID(0L, taskId), "<unnamed>", workflow.owner, cores, flops),
- HashSet()
- )
- entry.submissionTime = min(entry.submissionTime, submitTime)
- (workflow.tasks as MutableSet<Task>).add(task)
- tasks[taskId] = task
- taskDependencies[task] = dependencies
- }
- } finally {
- reader.close()
- }
-
- // Fix dependencies and dependents for all tasks
- taskDependencies.forEach { (task, dependencies) ->
- (task.dependencies as MutableSet<Task>).addAll(dependencies.map { taskId ->
- tasks[taskId] ?: throw IllegalArgumentException("Dependency task with id $taskId not found")
- })
- }
-
- // Create the entry iterator
- iterator = entries.values.sortedBy { it.submissionTime }.iterator()
- }
-
- override fun hasNext(): Boolean = iterator.hasNext()
-
- override fun next(): TraceEntry<Job> = iterator.next()
-
- override fun close() {}
-
- /**
- * An unnamed user.
- */
- private object UnnamedUser : User {
- override val name: String = "<unnamed>"
- override val uid: UUID = UUID.randomUUID()
- }
-
- /**
- * An entry in the trace.
- */
- private data class TraceEntryImpl(
- override var submissionTime: Instant,
- override val workload: Job
- ) : TraceEntry<Job>
-}
diff --git a/opendc-format-gwf/src/test/kotlin/com/atlarge/opendc/format/trace/gwf/GwfTraceReaderTest.kt b/opendc-format-gwf/src/test/kotlin/com/atlarge/opendc/format/trace/gwf/GwfTraceReaderTest.kt
deleted file mode 100644
index ca60f61d..00000000
--- a/opendc-format-gwf/src/test/kotlin/com/atlarge/opendc/format/trace/gwf/GwfTraceReaderTest.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.format.trace.gwf
-
-import org.junit.jupiter.api.DisplayName
-import org.junit.jupiter.api.Test
-
-/**
- * Test suite for the [GwfTraceReader] class.
- */
-@DisplayName("GwfTraceReader")
-internal class GwfTraceReaderTest {
- @Test
- fun `should open from InputStream`() {
- val input = GwfTraceReaderTest::class.java.getResourceAsStream("/askalon_workload_olde.gwf")
- val reader = GwfTraceReader(input)
- reader.close()
- }
-}
diff --git a/opendc-format-gwf/src/test/resources/trace.gwf b/opendc-format-gwf/src/test/resources/trace.gwf
deleted file mode 100644
index 75b4c8d8..00000000
--- a/opendc-format-gwf/src/test/resources/trace.gwf
+++ /dev/null
@@ -1,4 +0,0 @@
-WorkflowID, JobID , SubmitTime, RunTime , NProcs , ReqNProcs , Dependencies
-0 , 1 , 50 , 13 , 1 , 1 ,
-1 , 2 , 64 , 13 , 1 , 1 ,
-1 , 3 , 1821 , 12 , 1 , 1 , 2
diff --git a/opendc-format-sc18/build.gradle.kts b/opendc-format-sc18/build.gradle.kts
deleted file mode 100644
index b656f4e3..00000000
--- a/opendc-format-sc18/build.gradle.kts
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2018 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.
- */
-
-/* Build configuration */
-apply(from = "../gradle/kotlin.gradle")
-plugins {
- `java-library`
-}
-
-/* Project configuration */
-repositories {
- jcenter()
-}
-
-val junitJupiterVersion: String by extra
-val junitPlatformVersion: String by extra
-
-dependencies {
- api(project(":opendc-core"))
- api(project(":opendc-format"))
- api(project(":opendc-workflows"))
- api("com.fasterxml.jackson.module:jackson-module-kotlin:2.9.8")
- implementation(kotlin("stdlib"))
- implementation(kotlin("reflect"))
-
- testImplementation("org.junit.jupiter:junit-jupiter-api:$junitJupiterVersion")
- testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$junitJupiterVersion")
- testImplementation("org.junit.platform:junit-platform-launcher:$junitPlatformVersion")
-}
diff --git a/opendc-format-sc18/src/main/kotlin/com/atlarge/opendc/format/environment/sc18/Model.kt b/opendc-format-sc18/src/main/kotlin/com/atlarge/opendc/format/environment/sc18/Model.kt
deleted file mode 100644
index 4fbde269..00000000
--- a/opendc-format-sc18/src/main/kotlin/com/atlarge/opendc/format/environment/sc18/Model.kt
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.atlarge.opendc.format.environment.sc18
-
-import com.fasterxml.jackson.annotation.JsonSubTypes
-import com.fasterxml.jackson.annotation.JsonTypeInfo
-
-/**
- * A datacenter setup.
- *
- * @property name The name of the setup.
- * @property rooms The rooms in the datacenter.
- */
-data class Setup(val name: String, val rooms: List<Room>)
-
-/**
- * A room in a datacenter.
- *
- * @property type The type of room in the datacenter.
- * @property objects The objects in the room.
- */
-data class Room(val type: String, val objects: List<RoomObject>)
-
-/**
- * An object in a [Room].
- *
- * @property type The type of the room object.
- */
-@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
-@JsonSubTypes(value = [JsonSubTypes.Type(name = "RACK", value = RoomObject.Rack::class)])
-sealed class RoomObject(val type: String) {
- /**
- * A rack in a server room.
- *
- * @property machines The machines in the rack.
- */
- data class Rack(val machines: List<Machine>) : RoomObject("RACK")
-}
-
-/**
- * A machine in the setup that consists of the specified CPU's represented as
- * integer identifiers and ethernet speed.
- *
- * @property cpus The CPUs in the machine represented as integer identifiers.
- */
-data class Machine(val cpus: List<Int>)
diff --git a/opendc-format-sc18/src/main/kotlin/com/atlarge/opendc/format/environment/sc18/Sc18EnvironmentReader.kt b/opendc-format-sc18/src/main/kotlin/com/atlarge/opendc/format/environment/sc18/Sc18EnvironmentReader.kt
deleted file mode 100644
index 40ed5a45..00000000
--- a/opendc-format-sc18/src/main/kotlin/com/atlarge/opendc/format/environment/sc18/Sc18EnvironmentReader.kt
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.format.environment.sc18
-
-import com.atlarge.opendc.format.environment.EnvironmentReader
-import com.atlarge.opendc.model.Cluster
-import com.atlarge.opendc.model.Environment
-import com.atlarge.opendc.model.Platform
-import com.atlarge.opendc.model.Zone
-import com.atlarge.opendc.model.resources.compute.ProcessingElement
-import com.atlarge.opendc.model.resources.compute.ProcessingUnit
-import com.atlarge.opendc.model.resources.compute.host.Host
-import com.atlarge.opendc.model.resources.compute.scheduling.SpaceSharedMachineScheduler
-import com.fasterxml.jackson.databind.ObjectMapper
-import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
-import com.fasterxml.jackson.module.kotlin.readValue
-import java.io.InputStream
-import java.util.UUID
-
-/**
- * A parser for the JSON experiment setup files used for the SC18 paper: "A Reference Architecture for Datacenter
- * Schedulers".
- *
- * @param input The input stream to read from.
- * @param mapper The Jackson object mapper to use.
- */
-class Sc18EnvironmentReader(input: InputStream, mapper: ObjectMapper = jacksonObjectMapper()) : EnvironmentReader {
- /**
- * The environment that was read from the file.
- */
- private val environment: Environment
-
- init {
- val setup = mapper.readValue<Setup>(input)
- val clusters = setup.rooms.mapIndexed { i, room ->
- var counter = 0
- val hosts = room.objects.flatMap { roomObject ->
- when (roomObject) {
- is RoomObject.Rack -> {
- roomObject.machines.map { machine ->
- val cores = machine.cpus.flatMap { id ->
- when (id) {
- 1 -> List(4) { ProcessingElement(it, CPUS[0]) }
- 2 -> List(2) { ProcessingElement(it, CPUS[1]) }
- else -> throw IllegalArgumentException("The cpu id $id is not recognized")
- }
- }
- Host(UUID.randomUUID(), "node-${counter++}", SpaceSharedMachineScheduler, cores)
- }
- }
- }
- }
- Cluster(UUID.randomUUID(), "cluster-$i", hosts)
- }
-
- val platform = Platform(UUID.randomUUID(), "sc18-platform", listOf(
- Zone(UUID.randomUUID(), "zone", emptySet(), clusters)
- ))
-
- environment = Environment(setup.name, null, listOf(platform))
- }
-
- override fun read(): Environment = environment
-
- override fun close() {}
-
- companion object {
- val CPUS = arrayOf(
- ProcessingUnit("Intel", 6, 6920, "Intel(R) Core(TM) i7-6920HQ CPU @ 4.10GHz", 4100.0, 1),
- ProcessingUnit("Intel", 6, 6930, "Intel(R) Core(TM) i7-6920HQ CPU @ 3.50GHz", 3500.0, 1)
- )
- }
-}
diff --git a/opendc-format/src/main/kotlin/com/atlarge/opendc/format/environment/EnvironmentReader.kt b/opendc-format/src/main/kotlin/com/atlarge/opendc/format/environment/EnvironmentReader.kt
deleted file mode 100644
index 0ba3ae25..00000000
--- a/opendc-format/src/main/kotlin/com/atlarge/opendc/format/environment/EnvironmentReader.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.format.environment
-
-import com.atlarge.opendc.model.Environment
-import java.io.Closeable
-
-/**
- * An interface for reading descriptions of datacenter environments into memory as [Environment].
- */
-interface EnvironmentReader : Closeable {
- /**
- * Read the description of the datacenter environment as [Environment].
- */
- fun read(): Environment
-}
diff --git a/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/TraceEntry.kt b/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/TraceEntry.kt
deleted file mode 100644
index cf0ab526..00000000
--- a/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/TraceEntry.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.format.trace
-
-import com.atlarge.odcsim.Instant
-import com.atlarge.opendc.model.workload.Workload
-
-/**
- * An entry in a workload trace.
- *
- * @param T The shape of the workload in this entry.
- */
-interface TraceEntry<T : Workload> {
- /**
- * The time of submission of the workload.
- */
- val submissionTime: Instant
-
- /**
- * The workload in this trace entry.
- */
- val workload: T
-
- /**
- * Extract the submission time from this entry.
- */
- operator fun component1() = submissionTime
-
- /**
- * Extract the workload from this entry.
- */
- operator fun component2() = workload
-}
diff --git a/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/TraceReader.kt b/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/TraceReader.kt
deleted file mode 100644
index af8b272d..00000000
--- a/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/TraceReader.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.format.trace
-
-import com.atlarge.opendc.model.workload.Workload
-import java.io.Closeable
-
-/**
- * An interface for reading [Workload]s into memory.
- *
- * This interface must guarantee that the entries are delivered in order of submission time.
- *
- * @param T The shape of the workloads supported by this reader.
- */
-interface TraceReader<T : Workload> : Iterator<TraceEntry<T>>, Closeable
diff --git a/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/TraceWriter.kt b/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/TraceWriter.kt
deleted file mode 100644
index b5424fd2..00000000
--- a/opendc-format/src/main/kotlin/com/atlarge/opendc/format/trace/TraceWriter.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.format.trace
-
-import com.atlarge.odcsim.Instant
-import com.atlarge.opendc.model.workload.Workload
-import java.io.Closeable
-
-/**
- * An interface for persisting workload traces (e.g. to disk).
- *
- * @param T The type of [Workload] supported by this writer.
- */
-interface TraceWriter<T : Workload> : Closeable {
- /**
- * Write an entry to the trace.
- *
- * Entries must be written in order of submission time. Failing to do so results in a [IllegalArgumentException].
- *
- * @param submissionTime The time of submission of the workload.
- * @param workload The workload to write to the trace.
- */
- fun write(submissionTime: Instant, workload: T)
-}
diff --git a/opendc-workflows/build.gradle.kts b/opendc-workflows/build.gradle.kts
deleted file mode 100644
index 68f9aa5d..00000000
--- a/opendc-workflows/build.gradle.kts
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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.
- */
-
-/* Build configuration */
-apply(from = "../gradle/kotlin.gradle")
-plugins {
- `java-library`
-}
-
-/* Project configuration */
-repositories {
- jcenter()
-}
-
-val junitJupiterVersion: String by extra
-val junitPlatformVersion: String by extra
-
-dependencies {
- api(project(":odcsim-core"))
- api(project(":opendc-core"))
-
- implementation(kotlin("stdlib"))
-
- testImplementation(project(":odcsim-testkit"))
- testImplementation("org.junit.jupiter:junit-jupiter-api:$junitJupiterVersion")
- testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$junitJupiterVersion")
- testImplementation("org.junit.platform:junit-platform-launcher:$junitPlatformVersion")
- testRuntimeOnly("org.slf4j:slf4j-simple:1.7.25")
- testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.0.0")
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/StageWorkflowScheduler.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/StageWorkflowScheduler.kt
deleted file mode 100644
index 45f3c4b0..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/StageWorkflowScheduler.kt
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows
-
-import com.atlarge.odcsim.ActorContext
-import com.atlarge.odcsim.TimerScheduler
-import com.atlarge.opendc.model.services.provisioning.ProvisioningResponse
-import com.atlarge.opendc.model.services.workflows.stages.job.JobAdmissionPolicy
-import com.atlarge.opendc.model.services.workflows.stages.job.JobSortingPolicy
-import com.atlarge.opendc.model.services.workflows.stages.resources.ResourceDynamicFilterPolicy
-import com.atlarge.opendc.model.services.workflows.stages.resources.ResourceSelectionPolicy
-import com.atlarge.opendc.model.services.workflows.stages.task.TaskEligibilityPolicy
-import com.atlarge.opendc.model.services.workflows.stages.task.TaskSortingPolicy
-
-/**
- * A [WorkflowScheduler] that distributes work through a multi-stage process based on the Reference Architecture for
- * Datacenter Scheduling.
- */
-class StageWorkflowScheduler(
- private val mode: WorkflowSchedulerMode,
- private val jobAdmissionPolicy: JobAdmissionPolicy,
- private val jobSortingPolicy: JobSortingPolicy,
- private val taskEligibilityPolicy: TaskEligibilityPolicy,
- private val taskSortingPolicy: TaskSortingPolicy,
- private val resourceDynamicFilterPolicy: ResourceDynamicFilterPolicy,
- private val resourceSelectionPolicy: ResourceSelectionPolicy
-) : WorkflowScheduler {
- override fun invoke(
- ctx: ActorContext<WorkflowMessage>,
- timers: TimerScheduler<WorkflowMessage>,
- lease: ProvisioningResponse.Lease
- ): WorkflowSchedulerLogic {
- return StageWorkflowSchedulerLogic(ctx, timers, lease, mode, jobAdmissionPolicy,
- jobSortingPolicy, taskEligibilityPolicy, taskSortingPolicy, resourceDynamicFilterPolicy, resourceSelectionPolicy)
- }
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/StageWorkflowSchedulerLogic.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/StageWorkflowSchedulerLogic.kt
deleted file mode 100644
index 9d5f4bea..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/StageWorkflowSchedulerLogic.kt
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows
-
-import com.atlarge.odcsim.ActorContext
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.TimerScheduler
-import com.atlarge.odcsim.unsafeCast
-import com.atlarge.opendc.model.resources.compute.MachineMessage
-import com.atlarge.opendc.model.resources.compute.MachineRef
-import com.atlarge.opendc.model.resources.compute.scheduling.ProcessState
-import com.atlarge.opendc.model.services.provisioning.ProvisioningResponse
-import com.atlarge.opendc.model.services.resources.HostView
-import com.atlarge.opendc.model.services.workflows.stages.job.JobAdmissionPolicy
-import com.atlarge.opendc.model.services.workflows.stages.job.JobSortingPolicy
-import com.atlarge.opendc.model.services.workflows.stages.resources.ResourceDynamicFilterPolicy
-import com.atlarge.opendc.model.services.workflows.stages.resources.ResourceSelectionPolicy
-import com.atlarge.opendc.model.services.workflows.stages.task.TaskEligibilityPolicy
-import com.atlarge.opendc.model.services.workflows.stages.task.TaskSortingPolicy
-import com.atlarge.opendc.model.workload.application.Application
-import com.atlarge.opendc.model.workload.application.Pid
-import com.atlarge.opendc.model.workload.workflow.Job
-import com.atlarge.opendc.model.workload.workflow.Task
-
-/**
- * Logic of the [StageWorkflowScheduler].
- */
-class StageWorkflowSchedulerLogic(
- ctx: ActorContext<WorkflowMessage>,
- timers: TimerScheduler<WorkflowMessage>,
- lease: ProvisioningResponse.Lease,
- private val mode: WorkflowSchedulerMode,
- private val jobAdmissionPolicy: JobAdmissionPolicy,
- private val jobSortingPolicy: JobSortingPolicy,
- private val taskEligibilityPolicy: TaskEligibilityPolicy,
- private val taskSortingPolicy: TaskSortingPolicy,
- private val resourceDynamicFilterPolicy: ResourceDynamicFilterPolicy,
- private val resourceSelectionPolicy: ResourceSelectionPolicy
-) : WorkflowSchedulerLogic(ctx, timers, lease) {
-
- /**
- * The incoming jobs ready to be processed by the scheduler.
- */
- internal val incomingJobs: MutableSet<JobView> = mutableSetOf()
-
- /**
- * The active jobs in the system.
- */
- internal val activeJobs: MutableSet<JobView> = mutableSetOf()
-
- /**
- * The running tasks by [Pid].
- */
- internal val taskByPid = mutableMapOf<Pid, TaskView>()
-
- /**
- * The available processor cores on the leased machines.
- */
- internal val machineCores: MutableMap<HostView, Int> = HashMap()
-
- init {
- lease.hosts.forEach { machineCores[it] = it.host.cores.count() }
- }
-
- override fun submit(job: Job, handler: ActorRef<WorkflowEvent>) {
- // J1 Incoming Jobs
- val jobInstance = JobView(job, handler)
- val instances = job.tasks.associateWith {
- TaskView(jobInstance, it)
- }
-
- for ((task, instance) in instances) {
- instance.dependencies.addAll(task.dependencies.map { instances[it]!! })
- task.dependencies.forEach {
- instances[it]!!.dependents.add(instance)
- }
-
- // If the task has no dependency, it is a root task and can immediately be evaluated
- if (instance.isRoot) {
- instance.state = ProcessState.READY
- }
- }
-
- jobInstance.tasks = instances.values.toMutableSet()
- incomingJobs += jobInstance
- ctx.send(handler, WorkflowEvent.JobSubmitted(ctx.self, job, ctx.time))
- requestCycle()
- }
-
- /**
- * Indicate to the scheduler that a scheduling cycle is needed.
- */
- private fun requestCycle() {
- when (mode) {
- is WorkflowSchedulerMode.Interactive -> {
- schedule()
- }
- is WorkflowSchedulerMode.Batch -> {
- timers.after(mode, mode.quantum) {
- schedule()
- }
- }
- }
- }
-
- /**
- * Perform a scheduling cycle immediately.
- */
- override fun schedule() {
- // J2 Create list of eligible jobs
- jobAdmissionPolicy.startCycle(this)
- val eligibleJobs = incomingJobs.filter { jobAdmissionPolicy.shouldAdmit(this, it) }
- for (jobInstance in eligibleJobs) {
- incomingJobs -= jobInstance
- activeJobs += jobInstance
- ctx.send(jobInstance.broker, WorkflowEvent.JobStarted(ctx.self, jobInstance.job, ctx.time))
- }
-
- // J3 Sort jobs on criterion
- val sortedJobs = jobSortingPolicy(this, activeJobs)
-
- // J4 Per job
- for (jobInstance in sortedJobs) {
- // T1 Create list of eligible tasks
- taskEligibilityPolicy.startCycle(this)
- val eligibleTasks = jobInstance.tasks.filter { taskEligibilityPolicy.isEligible(this, it) }
-
- // T2 Sort tasks on criterion
- val sortedTasks = taskSortingPolicy(this, eligibleTasks)
-
- // T3 Per task
- for (instance in sortedTasks) {
- val hosts = resourceDynamicFilterPolicy(this, lease.hosts, instance)
- val host = resourceSelectionPolicy.select(this, hosts, instance)
-
- if (host != null) {
- // T4 Submit task to machine
- ctx.send(host.ref, MachineMessage.Submit(instance.task.application, instance, ctx.self.unsafeCast()))
- instance.host = host
- instance.state = ProcessState.RUNNING // Assume the application starts running
- machineCores.merge(host, instance.task.application.cores, Int::minus)
- } else {
- return
- }
- }
- }
- }
-
- override fun onSubmission(instance: MachineRef, application: Application, key: Any, pid: Pid) {
- val task = key as TaskView
- task.pid = pid
- taskByPid[pid] = task
- ctx.send(task.job.broker, WorkflowEvent.TaskStarted(ctx.self, task.job.job, task.task, ctx.time))
- }
-
- override fun onTermination(instance: MachineRef, pid: Pid, status: Int) {
- val task = taskByPid.remove(pid)!!
- val job = task.job
- task.state = ProcessState.TERMINATED
- job.tasks.remove(task)
- machineCores.merge(task.host!!, task.task.application.cores, Int::plus)
- ctx.send(job.broker, WorkflowEvent.TaskFinished(ctx.self, job.job, task.task, status, ctx.time))
-
- if (job.isFinished) {
- activeJobs -= job
- ctx.send(job.broker, WorkflowEvent.JobFinished(ctx.self, job.job, ctx.time))
- }
-
- requestCycle()
- }
-
- class JobView(val job: Job, val broker: ActorRef<WorkflowEvent>) {
- /**
- * A flag to indicate whether this job is finished.
- */
- val isFinished: Boolean
- get() = tasks.isEmpty()
-
- lateinit var tasks: MutableSet<TaskView>
- }
-
- class TaskView(val job: JobView, val task: Task) {
- /**
- * The dependencies of this task.
- */
- val dependencies = HashSet<TaskView>()
-
- /**
- * The dependents of this task.
- */
- val dependents = HashSet<TaskView>()
-
- /**
- * A flag to indicate whether this workflow task instance is a workflow root.
- */
- val isRoot: Boolean
- get() = dependencies.isEmpty()
-
- var state: ProcessState = ProcessState.CREATED
- set(value) {
- field = value
-
- // Mark the process as terminated in the graph
- if (value == ProcessState.TERMINATED) {
- markTerminated()
- }
- }
-
- var pid: Pid? = null
-
- var host: HostView? = null
-
- /**
- * Mark the specified [TaskView] as terminated.
- */
- private fun markTerminated() {
- for (dependent in dependents) {
- dependent.dependencies.remove(this)
-
- if (dependent.isRoot) {
- dependent.state = ProcessState.READY
- }
- }
- }
- }
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowScheduler.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowScheduler.kt
deleted file mode 100644
index c81085d4..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowScheduler.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows
-
-import com.atlarge.odcsim.ActorContext
-import com.atlarge.odcsim.TimerScheduler
-import com.atlarge.opendc.model.services.provisioning.ProvisioningResponse
-
-/**
- * A factory interface for constructing a [WorkflowSchedulerLogic].
- */
-interface WorkflowScheduler {
- /**
- * Construct a [WorkflowSchedulerLogic] in the given [ActorContext].
- *
- * @param ctx The context in which the scheduler runs.
- * @param timers The timer scheduler to use.
- * @param lease The resource lease to use.
- */
- operator fun invoke(
- ctx: ActorContext<WorkflowMessage>,
- timers: TimerScheduler<WorkflowMessage>,
- lease: ProvisioningResponse.Lease
- ): WorkflowSchedulerLogic
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowSchedulerLogic.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowSchedulerLogic.kt
deleted file mode 100644
index 09cb0ef9..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowSchedulerLogic.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows
-
-import com.atlarge.odcsim.ActorContext
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.TimerScheduler
-import com.atlarge.opendc.model.resources.compute.scheduling.ProcessObserver
-import com.atlarge.opendc.model.services.provisioning.ProvisioningResponse
-import com.atlarge.opendc.model.workload.workflow.Job
-
-/**
- * A workflow scheduler interface that schedules jobs across machines.
- *
- * @property ctx The context in which the scheduler runs.
- * @property timers The timer scheduler to use.
- * @property lease The resource lease to use.
- */
-abstract class WorkflowSchedulerLogic(
- protected val ctx: ActorContext<WorkflowMessage>,
- protected val timers: TimerScheduler<WorkflowMessage>,
- protected val lease: ProvisioningResponse.Lease
-) : ProcessObserver {
- /**
- * Submit the specified workflow for scheduling.
- */
- abstract fun submit(job: Job, handler: ActorRef<WorkflowEvent>)
-
- /**
- * Trigger an immediate scheduling cycle.
- */
- abstract fun schedule()
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowSchedulerMode.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowSchedulerMode.kt
deleted file mode 100644
index 0a4b40e5..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowSchedulerMode.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows
-
-import com.atlarge.odcsim.Duration
-
-/**
- * The operating mode of a workflow scheduler.
- */
-sealed class WorkflowSchedulerMode {
- /**
- * An interactive scheduler immediately triggers a new scheduling cycle when a workflow is received.
- */
- object Interactive : WorkflowSchedulerMode()
-
- /**
- * A batch scheduler triggers a scheduling cycle every time quantum if needed.
- */
- data class Batch(val quantum: Duration) : WorkflowSchedulerMode()
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowService.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowService.kt
deleted file mode 100644
index 72397203..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/WorkflowService.kt
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows
-
-import com.atlarge.odcsim.ActorRef
-import com.atlarge.odcsim.Behavior
-import com.atlarge.odcsim.Instant
-import com.atlarge.odcsim.TimerScheduler
-import com.atlarge.odcsim.coroutines.actorContext
-import com.atlarge.odcsim.coroutines.dsl.ask
-import com.atlarge.odcsim.coroutines.suspending
-import com.atlarge.odcsim.receiveMessage
-import com.atlarge.odcsim.same
-import com.atlarge.odcsim.unhandled
-import com.atlarge.odcsim.withTimers
-import com.atlarge.opendc.model.Zone
-import com.atlarge.opendc.model.ZoneRef
-import com.atlarge.opendc.model.find
-import com.atlarge.opendc.model.resources.compute.MachineEvent
-import com.atlarge.opendc.model.services.AbstractService
-import com.atlarge.opendc.model.services.Service
-import com.atlarge.opendc.model.services.ServiceProvider
-import com.atlarge.opendc.model.services.provisioning.ProvisioningMessage
-import com.atlarge.opendc.model.services.provisioning.ProvisioningResponse
-import com.atlarge.opendc.model.services.provisioning.ProvisioningService
-import com.atlarge.opendc.model.workload.workflow.Job
-import com.atlarge.opendc.model.workload.workflow.Task
-import java.util.UUID
-
-/**
- * A service for cloud workflow management.
- *
- * The workflow scheduler is modelled after the Reference Architecture for Datacenter Scheduling by Andreadis et al.
- */
-class WorkflowService(val scheduler: WorkflowScheduler) : ServiceProvider {
- override val uid: UUID = UUID.randomUUID()
- override val name: String = "workflows"
- override val provides: Set<Service<*>> = setOf(WorkflowService)
- override val dependencies: Set<Service<*>> = setOf(ProvisioningService)
-
- /**
- * Build the runtime [Behavior] for the workflow service, responding to messages of shape [WorkflowMessage].
- */
- override fun invoke(zone: Zone, ref: ZoneRef): Behavior<WorkflowMessage> = suspending { ctx ->
- val provisioner = ref.find(ProvisioningService)
- // Wait for 0.1 sec before asking the provisioner to allow it to initialize. Will return empty response if asked
- // immediately.
- val lease: ProvisioningResponse.Lease = actorContext<ProvisioningResponse>().ask(provisioner, after = 0.1) { ProvisioningMessage.Request(Int.MAX_VALUE, it) }
-
- withTimers<Any> { timers ->
- @Suppress("UNCHECKED_CAST")
- val schedulerLogic = scheduler(ctx, timers as TimerScheduler<WorkflowMessage>, lease)
-
- receiveMessage { msg ->
- when (msg) {
- is WorkflowMessage.Submit -> {
- schedulerLogic.submit(msg.job, msg.broker)
- same()
- }
- is MachineEvent.Submitted -> {
- schedulerLogic.onSubmission(msg.instance, msg.application, msg.key, msg.pid)
- same()
- }
- is MachineEvent.Terminated -> {
- schedulerLogic.onTermination(msg.instance, msg.pid, msg.status)
- same()
- }
- else ->
- unhandled()
- }
- }
- }.narrow()
- }
-
- companion object : AbstractService<WorkflowMessage>(UUID.randomUUID(), "workflows")
-}
-
-/**
- * A reference to the workflow service instance.
- */
-typealias WorkflowServiceRef = ActorRef<WorkflowMessage>
-
-/**
- * A message protocol for communicating to the workflow service.
- */
-sealed class WorkflowMessage {
- /**
- * Submit the specified [Job] to the workflow service for scheduling.
- *
- * @property job The workflow to submit for scheduling.
- * @property broker The broker that has submitted this workflow on behalf of a user and that needs to be kept
- * up-to-date.
- */
- data class Submit(val job: Job, val broker: ActorRef<WorkflowEvent>) : WorkflowMessage()
-}
-
-/**
- * A message protocol used by the workflow service to respond to [WorkflowMessage]s.
- */
-sealed class WorkflowEvent {
- /**
- * Indicate that the specified [Job] was submitted to the workflow service.
- *
- * @property service The reference to the service the job was submitted to.
- * @property job The job that has been submitted.
- * @property time A timestamp of the moment the job was received.
- */
- data class JobSubmitted(
- val service: WorkflowServiceRef,
- val job: Job,
- val time: Instant
- ) : WorkflowEvent()
-
- /**
- * Indicate that the specified [Job] has become active.
- *
- * @property service The reference to the service the job was submitted to.
- * @property job The job that has been submitted.
- * @property time A timestamp of the moment the job started.
- */
- data class JobStarted(
- val service: WorkflowServiceRef,
- val job: Job,
- val time: Instant
- ) : WorkflowEvent()
-
- /**
- * Indicate that the specified [Task] has started processing.
- *
- * @property service The reference to the service the job was submitted to.
- * @property job The job that contains this task.
- * @property task The task that has started processing.
- * @property time A timestamp of the moment the task started.
- */
- data class TaskStarted(
- val service: WorkflowServiceRef,
- val job: Job,
- val task: Task,
- val time: Instant
- ) : WorkflowEvent()
-
- /**
- * Indicate that the specified [Task] has started processing.
- *
- * @property service The reference to the service the job was submitted to.
- * @property job The job that contains this task.
- * @property task The task that has started processing.
- * @property status The exit code of the task, where zero means successful.
- * @property time A timestamp of the moment the task finished.
- */
- data class TaskFinished(
- val service: WorkflowServiceRef,
- val job: Job,
- val task: Task,
- val status: Int,
- val time: Instant
- ) : WorkflowEvent()
-
- /**
- * Indicate that the specified [Job] has finished processing.
- *
- * @property service The reference to the service the job was submitted to.
- * @property job The job that has finished processing.
- * @property time A timestamp of the moment the task finished.
- */
- data class JobFinished(
- val service: WorkflowServiceRef,
- val job: Job,
- val time: Instant
- ) : WorkflowEvent()
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/FifoJobSortingPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/FifoJobSortingPolicy.kt
deleted file mode 100644
index c58d2210..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/FifoJobSortingPolicy.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.job
-
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-
-/**
- * The [FifoJobSortingPolicy] sorts tasks based on the order of arrival in the queue.
- */
-class FifoJobSortingPolicy : JobSortingPolicy {
- override fun invoke(
- scheduler: StageWorkflowSchedulerLogic,
- jobs: Collection<StageWorkflowSchedulerLogic.JobView>
- ): List<StageWorkflowSchedulerLogic.JobView> = jobs.toList()
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/JobAdmissionPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/JobAdmissionPolicy.kt
deleted file mode 100644
index be60fa9b..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/JobAdmissionPolicy.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.job
-
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-
-/**
- * A policy interface for admitting [StageWorkflowSchedulerLogic.JobView]s to a scheduling cycle.
- */
-interface JobAdmissionPolicy {
- /**
- * A method that is invoked at the start of each scheduling cycle.
- *
- * @param scheduler The scheduler that started the cycle.
- */
- fun startCycle(scheduler: StageWorkflowSchedulerLogic) {}
-
- /**
- * Determine whether the specified [StageWorkflowSchedulerLogic.JobView] should be admitted to the scheduling cycle.
- *
- * @param scheduler The scheduler that should admit or reject the job.
- * @param job The workflow that has been submitted.
- * @return `true` if the workflow may be admitted to the scheduling cycle, `false` otherwise.
- */
- fun shouldAdmit(scheduler: StageWorkflowSchedulerLogic, job: StageWorkflowSchedulerLogic.JobView): Boolean
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/JobSortingPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/JobSortingPolicy.kt
deleted file mode 100644
index 3af88aa7..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/JobSortingPolicy.kt
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.job
-
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-
-/**
- * A policy interface for ordering admitted workflows in the scheduling queue.
- */
-interface JobSortingPolicy {
- /**
- * Sort the given collection of jobs on a given criterion.
- *
- * @param scheduler The scheduler that started the cycle.
- * @param jobs The collection of tasks that should be sorted.
- * @return The sorted list of jobs.
- */
- operator fun invoke(
- scheduler: StageWorkflowSchedulerLogic,
- jobs: Collection<StageWorkflowSchedulerLogic.JobView>
- ): List<StageWorkflowSchedulerLogic.JobView>
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/NullJobAdmissionPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/NullJobAdmissionPolicy.kt
deleted file mode 100644
index 5436a1a1..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/NullJobAdmissionPolicy.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.job
-
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-
-/**
- * A [JobAdmissionPolicy] that admits all jobs.
- */
-object NullJobAdmissionPolicy : JobAdmissionPolicy {
- /**
- * Admit every submitted job.
- */
- override fun shouldAdmit(
- scheduler: StageWorkflowSchedulerLogic,
- job: StageWorkflowSchedulerLogic.JobView
- ): Boolean = true
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/RandomJobSortingPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/RandomJobSortingPolicy.kt
deleted file mode 100644
index 7da59692..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/job/RandomJobSortingPolicy.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.job
-
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-import kotlin.random.Random
-
-/**
- * The [RandomJobSortingPolicy] sorts tasks randomly.
- *
- * @property random The [Random] instance to use when sorting the list of tasks.
- */
-class RandomJobSortingPolicy(private val random: Random = Random.Default) : JobSortingPolicy {
- override fun invoke(
- scheduler: StageWorkflowSchedulerLogic,
- jobs: Collection<StageWorkflowSchedulerLogic.JobView>
- ): List<StageWorkflowSchedulerLogic.JobView> = jobs.shuffled(random)
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/FirstFitResourceSelectionPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/FirstFitResourceSelectionPolicy.kt
deleted file mode 100644
index afaf075d..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/FirstFitResourceSelectionPolicy.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.resources
-
-import com.atlarge.opendc.model.services.resources.HostView
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-
-/**
- * A [ResourceSelectionPolicy] that selects the first machine that is available.
- */
-class FirstFitResourceSelectionPolicy : ResourceSelectionPolicy {
- override fun select(
- scheduler: StageWorkflowSchedulerLogic,
- machines: List<HostView>,
- task: StageWorkflowSchedulerLogic.TaskView
- ): HostView? =
- machines.firstOrNull()
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/FunctionalResourceDynamicFilterPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/FunctionalResourceDynamicFilterPolicy.kt
deleted file mode 100644
index 3f28a040..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/FunctionalResourceDynamicFilterPolicy.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.resources
-
-import com.atlarge.opendc.model.services.resources.HostView
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-
-/**
- * A [ResourceDynamicFilterPolicy] based on the amount of cores available on the machine and the cores required for
- * the task.
- */
-class FunctionalResourceDynamicFilterPolicy : ResourceDynamicFilterPolicy {
- override fun invoke(
- scheduler: StageWorkflowSchedulerLogic,
- machines: List<HostView>,
- task: StageWorkflowSchedulerLogic.TaskView
- ): List<HostView> {
- return machines
- .filter { scheduler.machineCores[it] ?: 0 >= task.task.application.cores }
- }
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/ResourceDynamicFilterPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/ResourceDynamicFilterPolicy.kt
deleted file mode 100644
index f73c0d9e..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/ResourceDynamicFilterPolicy.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.resources
-
-import com.atlarge.opendc.model.services.resources.HostView
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-
-/**
- * This interface represents the **R4** stage of the Reference Architecture for Schedulers and acts as a filter yielding
- * a list of resources with sufficient resource-capacities, based on fixed or dynamic requirements, and on predicted or
- * monitored information about processing unit availability, memory occupancy, etc.
- */
-interface ResourceDynamicFilterPolicy {
- /**
- * Filter the list of machines based on dynamic information.
- *
- * @param scheduler The scheduler to filter the machines.
- * @param machines The list of machines in the system.
- * @param task The task that is to be scheduled.
- * @return The machines on which the task can be scheduled.
- */
- operator fun invoke(
- scheduler: StageWorkflowSchedulerLogic,
- machines: List<HostView>,
- task: StageWorkflowSchedulerLogic.TaskView
- ): List<HostView>
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/ResourceSelectionPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/ResourceSelectionPolicy.kt
deleted file mode 100644
index a9172a53..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/resources/ResourceSelectionPolicy.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.resources
-
-import com.atlarge.opendc.model.services.resources.HostView
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-
-/**
- * This interface represents the **R5** stage of the Reference Architecture for Schedulers and matches the the selected
- * task with a (set of) resource(s), using policies such as First-Fit, Worst-Fit, and Best-Fit.
- */
-interface ResourceSelectionPolicy {
- /**
- * Select a machine on which the task should be scheduled.
- *
- * @param scheduler The scheduler to select the machine.
- * @param machines The list of machines in the system.
- * @param task The task that is to be scheduled.
- * @return The selected machine or `null` if no machine could be found.
- */
- fun select(
- scheduler: StageWorkflowSchedulerLogic,
- machines: List<HostView>,
- task: StageWorkflowSchedulerLogic.TaskView
- ): HostView?
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/FifoTaskSortingPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/FifoTaskSortingPolicy.kt
deleted file mode 100644
index 2eb2f6fb..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/FifoTaskSortingPolicy.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.task
-
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-
-/**
- * The [FifoTaskSortingPolicy] sorts tasks based on the order of arrival in the queue.
- */
-class FifoTaskSortingPolicy : TaskSortingPolicy {
- override fun invoke(
- scheduler: StageWorkflowSchedulerLogic,
- tasks: Collection<StageWorkflowSchedulerLogic.TaskView>
- ): List<StageWorkflowSchedulerLogic.TaskView> = tasks.toList()
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/FunctionalTaskEligibilityPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/FunctionalTaskEligibilityPolicy.kt
deleted file mode 100644
index 2e7cc8c1..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/FunctionalTaskEligibilityPolicy.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.task
-
-import com.atlarge.opendc.model.resources.compute.scheduling.ProcessState
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-
-/**
- * A [TaskEligibilityPolicy] that marks tasks as eligible if they are tasks roots within the job.
- */
-class FunctionalTaskEligibilityPolicy : TaskEligibilityPolicy {
- override fun isEligible(
- scheduler: StageWorkflowSchedulerLogic,
- task: StageWorkflowSchedulerLogic.TaskView
- ): Boolean = task.state == ProcessState.READY
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/RandomTaskSortingPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/RandomTaskSortingPolicy.kt
deleted file mode 100644
index 69462e41..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/RandomTaskSortingPolicy.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.task
-
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-import kotlin.random.Random
-
-/**
- * The [RandomTaskSortingPolicy] sorts tasks randomly.
- *
- * @property random The [Random] instance to use when sorting the list of tasks.
- */
-class RandomTaskSortingPolicy(private val random: Random = Random.Default) : TaskSortingPolicy {
- override fun invoke(
- scheduler: StageWorkflowSchedulerLogic,
- tasks: Collection<StageWorkflowSchedulerLogic.TaskView>
- ): List<StageWorkflowSchedulerLogic.TaskView> = tasks.shuffled(random)
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/TaskEligibilityPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/TaskEligibilityPolicy.kt
deleted file mode 100644
index c3c7e725..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/TaskEligibilityPolicy.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.task
-
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-
-/**
- * A policy interface for determining the eligibility of tasks in a scheduling cycle.
- */
-interface TaskEligibilityPolicy {
- /**
- * A method that is invoked at the start of each scheduling cycle.
- *
- * @param scheduler The scheduler that started the cycle.
- */
- fun startCycle(scheduler: StageWorkflowSchedulerLogic) {}
-
- /**
- * Determine whether the specified [StageWorkflowSchedulerLogic.TaskView] is eligible to be scheduled.
- *
- * @param scheduler The scheduler that is determining whether the task is eligible.
- * @param task The task instance to schedule.
- * @return `true` if the task eligible to be scheduled, `false` otherwise.
- */
- fun isEligible(scheduler: StageWorkflowSchedulerLogic, task: StageWorkflowSchedulerLogic.TaskView): Boolean
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/TaskSortingPolicy.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/TaskSortingPolicy.kt
deleted file mode 100644
index 3f296d0e..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/services/workflows/stages/task/TaskSortingPolicy.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.services.workflows.stages.task
-
-import com.atlarge.opendc.model.services.workflows.StageWorkflowSchedulerLogic
-
-/**
- * This interface represents the **T2** stage of the Reference Architecture for Datacenter Schedulers and provides the
- * scheduler with a sorted list of tasks to schedule.
- */
-interface TaskSortingPolicy {
- /**
- * Sort the given list of tasks on a given criterion.
- *
- * @param scheduler The scheduler that is sorting the tasks.
- * @param tasks The collection of tasks that should be sorted.
- * @return The sorted list of tasks.
- */
- operator fun invoke(
- scheduler: StageWorkflowSchedulerLogic,
- tasks: Collection<StageWorkflowSchedulerLogic.TaskView>
- ): List<StageWorkflowSchedulerLogic.TaskView>
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/workload/workflow/Job.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/workload/workflow/Job.kt
deleted file mode 100644
index dd72cf6d..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/workload/workflow/Job.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.workload.workflow
-
-import com.atlarge.opendc.model.User
-import com.atlarge.opendc.model.workload.Workload
-import java.util.UUID
-
-/**
- * A workload that represents a directed acyclic graph (DAG) of tasks with control and data dependencies between tasks.
- *
- * @property uid A unique identified of this workflow.
- * @property name The name of this workflow.
- * @property owner The owner of the workflow.
- * @property tasks The tasks that are part of this workflow.
- */
-data class Job(
- override val uid: UUID,
- override val name: String,
- override val owner: User,
- val tasks: Set<Task>
-) : Workload {
- override fun equals(other: Any?): Boolean = other is Job && uid == other.uid
-
- override fun hashCode(): Int = uid.hashCode()
-}
diff --git a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/workload/workflow/Task.kt b/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/workload/workflow/Task.kt
deleted file mode 100644
index 0cc3fa0e..00000000
--- a/opendc-workflows/src/main/kotlin/com/atlarge/opendc/model/workload/workflow/Task.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2019 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 com.atlarge.opendc.model.workload.workflow
-
-import com.atlarge.opendc.model.Identity
-import com.atlarge.opendc.model.workload.application.Application
-import java.util.UUID
-
-/**
- * A stage of a [Job].
- *
- * @property uid A unique identified of this task.
- * @property name The name of this task.
- * @property application The application to run as part of this workflow task.
- * @property dependencies The dependencies of this task in order for it to execute.
- */
-data class Task(
- override val uid: UUID,
- override val name: String,
- val application: Application,
- val dependencies: Set<Task>
-) : Identity {
- override fun equals(other: Any?): Boolean = other is Task && uid == other.uid
-
- override fun hashCode(): Int = uid.hashCode()
-}
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 085885ba..5abdd4ab 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -23,13 +23,6 @@
*/
rootProject.name = "opendc-simulator"
-include(":odcsim-core")
-include(":odcsim-engine-tests")
-include(":odcsim-engine-omega")
-include(":odcsim-testkit")
-include(":opendc-core")
-include(":opendc-experiments-tpds")
-include(":opendc-format")
-include(":opendc-format-gwf")
-include(":opendc-format-sc18")
-include(":opendc-workflows")
+include(":odcsim:odcsim-core")
+include(":odcsim:odcsim-engine-tests")
+include(":odcsim:odcsim-engine-omega")