summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ConfigParser.kt73
-rw-r--r--opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentCli.kt74
-rw-r--r--opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentRunner.kt32
-rw-r--r--opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/RequestRunner.kt12
-rw-r--r--opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt1
-rw-r--r--resources/data/databasebin0 -> 8192 bytes
-rw-r--r--resources/experiments/config.json7
7 files changed, 169 insertions, 30 deletions
diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ConfigParser.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ConfigParser.kt
new file mode 100644
index 00000000..457a26ea
--- /dev/null
+++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ConfigParser.kt
@@ -0,0 +1,73 @@
+package org.opendc.experiments.base.runner
+
+import kotlinx.serialization.ExperimentalSerializationApi
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.json.Json
+import kotlinx.serialization.json.decodeFromStream
+import java.io.BufferedReader
+import java.io.BufferedWriter
+import java.io.File
+import java.io.InputStream
+import java.io.InputStreamReader
+import java.io.OutputStream
+import java.io.OutputStreamWriter
+import java.net.ServerSocket
+import java.net.Socket
+import java.net.SocketImpl
+
+
+/**
+ * @property name
+ * @property backlog the amount of connections to accept
+ * @property databasePath
+ * @property address IPv4 address
+ * @property port
+ */
+@Serializable
+public data class Config(
+ var name: String = "",
+ var backlog: Int = 0,
+ val databasePath: String = "",
+ val address: String = "",
+ val port: Int = 8080,
+){
+ public companion object{
+ public var input: InputStream? = null
+ public var output: OutputStream? = null
+ public var reader: BufferedReader? = null
+ public var writer: BufferedWriter? = null
+
+ public var socket: Socket? = null
+
+ public fun setConfigSocket(socket: Socket?){
+ this.socket = socket
+ input = socket?.getInputStream()
+ output = socket?.getOutputStream()
+
+ reader = BufferedReader(InputStreamReader(input))
+ writer = BufferedWriter(OutputStreamWriter(output))
+ }
+
+ public fun getConfigReader() : BufferedReader? {
+ return reader
+ }
+
+ public fun getConfigWriter() : BufferedWriter? {
+ writer?.write("Hello\n")
+ writer?.newLine()
+ return writer
+ }
+ }
+}
+/**
+ * Reads `config.json` into Config data class.
+ */
+public class ConfigReader {
+ private val jsonReader = Json
+ public fun read(file: File): Config = read(file.inputStream())
+ @OptIn(ExperimentalSerializationApi::class)
+ public fun read(input: InputStream): Config {
+ return jsonReader.decodeFromStream<Config>(input)
+ }
+}
+
diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentCli.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentCli.kt
index 27348ece..1d79cc42 100644
--- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentCli.kt
+++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentCli.kt
@@ -25,64 +25,82 @@
package org.opendc.experiments.base.runner
import com.github.ajalt.clikt.core.CliktCommand
-import com.github.ajalt.clikt.parameters.options.default
import com.github.ajalt.clikt.parameters.options.defaultLazy
-import com.github.ajalt.clikt.parameters.options.help
import com.github.ajalt.clikt.parameters.options.option
import com.github.ajalt.clikt.parameters.types.file
-import com.github.ajalt.clikt.parameters.types.int
import org.opendc.experiments.base.experiment.getExperiment
import java.io.File
+import java.io.IOException
import java.net.InetAddress
import java.net.ServerSocket
+import java.net.Socket
/**
* Main entrypoint of the application.
*/
public fun main(args: Array<String>) {
- if(args.size == 2){
- ExperimentCommand().main(args)
- return
- }
- ExperimentListener().main(args)
+ if(args.size == 4) ExperimentCommand().main(args)
+ else ExperimentListener().main(args)
}
/**
- * Represents the command for the Scenario experiments.
+ * Opens a client socket from `config`, but otherwise works as before.
*/
-
internal class ExperimentCommand : CliktCommand(name = "experiment") {
- /**
- * The path to the environment directory.
- */
+ private val configPath by option("--config-path", help = "path to config file")
+ .file(canBeDir = false, canBeFile = true)
+ .defaultLazy { File("resources/config.json") }
+
private val experimentPath by option("--experiment-path", help = "path to experiment file")
.file(canBeDir = false, canBeFile = true)
.defaultLazy { File("resources/experiment.json") }
override fun run() {
- val experiment = getExperiment(experimentPath)
- runExperiment(experiment)
+ val configReader = ConfigReader()
+ val config = configReader.read(configPath)
+ var clientSocket : Socket? = null
+
+ try {
+ clientSocket = Socket(config.address, config.port)
+ Config.setConfigSocket(clientSocket)
+ val experiment = getExperiment(experimentPath)
+ runExperiment(experiment)
+
+ } catch (e: IOException) {
+ println("${e.message}")
+ } finally {
+ clientSocket?.close()
+ }
+
}
}
/**
- * This class parses the CLI arguments and creates a socket for the listener.
- * Parameters below are the expected CLI arguments in respective order.
- * @param port The port to listen to.
- * @param backlog The number of available connections.
- * @param address The address to bind to.
+ * Creates a server socket from `config`.
*/
internal class ExperimentListener: CliktCommand(name = "listener") {
- private val port : Int by option("--port").int().default(8080).help("port to listen to")
- private val backlog : Int by option("--backlog").int().default(8080).help("number of connections")
- private val address : String by option("--address").default("127.0.0.1").help("address to bind to")
+ private val configPath by option("--config-path", help = "path to config file")
+ .file(canBeDir = false, canBeFile = true)
+ .defaultLazy { File("resources/config.json") }
override fun run() {
- val inetAddress = InetAddress.getByName(address)
- require(port in 1..<65536) { "Port must be between 0 and 65536" }
- require(backlog in 1..<50) { "Backlog must be between 1 and 50" }
+ val configReader = ConfigReader()
+ var serverSocket: ServerSocket? = null
+ val config = configReader.read(configPath)
+ val inetAddress = InetAddress.getByName(config.address)
- val serverSocket = ServerSocket(port, backlog, inetAddress)
- runListener(serverSocket)
+ try {
+ serverSocket = ServerSocket(config.port, config.backlog, inetAddress)
+ runListener(serverSocket)
+ } catch (e: IOException) {
+ println("${e.message}")
+ } finally {
+ serverSocket?.close()
+ }
}
}
+
+
+
+
+
diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentRunner.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentRunner.kt
index 83dbe6ac..000822fb 100644
--- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentRunner.kt
+++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ExperimentRunner.kt
@@ -25,7 +25,15 @@ package org.opendc.experiments.base.runner
import me.tongfei.progressbar.ProgressBarBuilder
import me.tongfei.progressbar.ProgressBarStyle
import org.opendc.experiments.base.experiment.Scenario
+import java.io.BufferedReader
+import java.io.BufferedWriter
+import java.io.IOException
+import java.io.InputStream
+import java.io.InputStreamReader
+import java.io.OutputStream
+import java.io.OutputStreamWriter
import java.net.ServerSocket
+import java.net.Socket
/**
@@ -56,15 +64,35 @@ public fun runExperiment(experiment: List<Scenario>) {
println("$ansiBlue Starting seed: $seed $ansiReset")
runScenario(scenario, seed.toLong())
pb.step()
+ Config.getConfigWriter()?.write("Hello from beyond\n")
}
}
pb.close()
}
/**
- * Accepts and processes incoming requests.
+ * Accepts a (single) connection and listens for requests.
* @param socket The socket to listen to.
*/
public fun runListener(socket: ServerSocket) {
- println("Hello!")
+ var client : Socket? = null
+ try {
+ client = socket.accept()
+ // here you should create another thread listening for sever-Kafka-client
+ // communication, and to store the incoming results into Postgresql
+
+ Config.setConfigSocket(client)
+ var request: String?
+
+ while(true){
+ request = Config.getConfigReader()?.readLine()
+ if(request == null) break
+ runRequest(request)
+ }
+
+ } catch (e: IOException) {
+ println("${e.message}")
+ } finally {
+ client?.close()
+ }
} \ No newline at end of file
diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/RequestRunner.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/RequestRunner.kt
new file mode 100644
index 00000000..5ef8d8ce
--- /dev/null
+++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/RequestRunner.kt
@@ -0,0 +1,12 @@
+package org.opendc.experiments.base.runner
+
+/**
+ * Processes a single HTTP request.
+ * @param request The request to process.
+ */
+
+public fun runRequest(request: String) {
+ // https://github.com/am-i-helpful/opendc/blob/master/opendc-oda/opendc-oda-experiments/src/main/kotlin/org/opendc/oda/experimentrunner/ODAComputeMonitor.kt
+ // Do this here
+ println("The request is $request")
+} \ No newline at end of file
diff --git a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt
index b07a50ae..6d094eb4 100644
--- a/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt
+++ b/opendc-experiments/opendc-experiments-base/src/main/kotlin/org/opendc/experiments/base/runner/ScenarioRunner.kt
@@ -76,6 +76,7 @@ public fun runScenario(scenario: Scenario) {
* @param scenario The scenario to run
* @param seed The starting seed of the random generator.
*/
+
public fun runScenario(
scenario: Scenario,
seed: Long,
diff --git a/resources/data/database b/resources/data/database
new file mode 100644
index 00000000..e47bac3d
--- /dev/null
+++ b/resources/data/database
Binary files differ
diff --git a/resources/experiments/config.json b/resources/experiments/config.json
new file mode 100644
index 00000000..a40d3a66
--- /dev/null
+++ b/resources/experiments/config.json
@@ -0,0 +1,7 @@
+{
+ "name": "configuration file",
+ "port": "8080",
+ "backlog": 20,
+ "address": "127.0.0.1",
+ "databasePath" : "resources/data/database"
+}