diff options
| author | mjkwiatkowski <mati.rewa@gmail.com> | 2026-02-13 12:45:56 +0100 |
|---|---|---|
| committer | mjkwiatkowski <mati.rewa@gmail.com> | 2026-02-13 12:45:56 +0100 |
| commit | e5b47b5afd3040fb55bd310e06cfe0514156e904 (patch) | |
| tree | 6277ae8e3cc3cf384edf256e18c9aac2f6e9cc98 /opendc-experiments | |
| parent | 4d37bbed4a1f745c331ba996fc860d79e3e51e8f (diff) | |
Diffstat (limited to 'opendc-experiments')
5 files changed, 162 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, |
