diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt index 5bcfa5e77ce78edf5af5478d6c1e4bb065b5e5f7..c5c2baf07a0227070b72ec8eb86b9af0534b15a7 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt @@ -1,5 +1,6 @@ package theodolite.execution +import mu.KotlinLogging import theodolite.execution.BenchmarkExecutor import theodolite.util.Benchmark import theodolite.util.LoadDimension @@ -13,8 +14,6 @@ class TestBenchmarkExecutor(private val mockResults: Array<Array<Boolean>>, benc override fun runExperiment(load: LoadDimension, res: Resource): Boolean { val result = this.mockResults[load.get()][res.get()] - System.out.println("load :" + load.get().toString() + ", res: " + res.get().toString() + ", res: " + result) - this.results.setResult(Pair(load, res), result) return result; } diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt index fb7facb29f2eeef39f82f3e4bb56ececa4dcb23f..7fdd3990ce313a5a77e37aa9215a7dbd1742ed24 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt @@ -1,5 +1,6 @@ package theodolite.execution +import mu.KotlinLogging import theodolite.k8s.UC1Benchmark import theodolite.strategies.restriction.LowerBoundRestriction import theodolite.strategies.searchstrategy.CompositeStrategy @@ -10,6 +11,8 @@ import theodolite.util.Resource import theodolite.util.Results import java.time.Duration +private val logger = KotlinLogging.logger {} + class TheodoliteExecutor() { val path = "/home/lorenz/git/spesb/theodolite-quarkus/src/main/resources/yaml" private fun loadConfig(): Config { @@ -31,7 +34,9 @@ class TheodoliteExecutor() { ) ) val results: Results = Results() + val executionDuration = Duration.ofSeconds(60 * 5) + val executor: BenchmarkExecutor = KafkaBenchmarkExecutor(benchmark, results, executionDuration) val restrictionStrategy = LowerBoundRestriction(results) @@ -56,8 +61,7 @@ class TheodoliteExecutor() { // execute benchmarks for each load for (load in config.loads) { - config.compositeStrategy.findSuitableResources(load, config.resources) + config.compositeStrategy.findSuitableResource(load, config.resources) } - } -} \ No newline at end of file +} diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/k8s/TopicManager.kt b/theodolite-quarkus/src/main/kotlin/theodolite/k8s/TopicManager.kt index 23954d19831e022a2590c5493509e9b4d688ca93..0b643ac101aa82c21559e123d221ba1ac750bdf5 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/k8s/TopicManager.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/k8s/TopicManager.kt @@ -1,10 +1,13 @@ package theodolite.k8s +import mu.KotlinLogging import org.apache.kafka.clients.admin.AdminClient import org.apache.kafka.clients.admin.AdminClientConfig import org.apache.kafka.clients.admin.ListTopicsResult import org.apache.kafka.clients.admin.NewTopic +private val logger = KotlinLogging.logger {} + class TopicManager(boostrapIp: String) { val props = hashMapOf<String, Any>(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG to boostrapIp) lateinit var kafkaAdmin: AdminClient @@ -13,7 +16,7 @@ class TopicManager(boostrapIp: String) { try { kafkaAdmin = AdminClient.create(props) } catch (e: Exception) { - System.out.println(e.toString()) + logger.error {e.toString()} } } @@ -25,7 +28,7 @@ class TopicManager(boostrapIp: String) { newTopics.add(tops) } kafkaAdmin.createTopics(newTopics) - System.out.println("Topics created") + logger.info {"Topics created"} } fun createTopics(topics: List<String>, numPartitions: Int, replicationfactor: Short) { @@ -36,7 +39,7 @@ class TopicManager(boostrapIp: String) { newTopics.add(tops) } kafkaAdmin.createTopics(newTopics) - System.out.println("Creation of $topics started") + logger.info {"Creation of $topics started"} } fun deleteTopics(topics: List<String>) { @@ -46,9 +49,9 @@ class TopicManager(boostrapIp: String) { try { result.all().get() } catch (ex: Exception) { - System.out.println(ex.toString()) + logger.error {ex.toString()} } - System.out.println("Topics deleted") + logger.info {"Topics deleted"} } fun getTopics(): ListTopicsResult? { diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/k8s/UC1Benchmark.kt b/theodolite-quarkus/src/main/kotlin/theodolite/k8s/UC1Benchmark.kt index 4dee8d9411d86da8014f7d850306607aa96f62a1..645c2acdd142bdb2d949419ec4e3ea00e7e87e4f 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/k8s/UC1Benchmark.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/k8s/UC1Benchmark.kt @@ -67,8 +67,8 @@ class UC1Benchmark(config: UC1BenchmarkConfig) : Benchmark(config) { // set environment variables val environmentVariables: MutableMap<String, String> = mutableMapOf() - environmentVariables.put("KAFKA_BOOTSTRAP_SERVERS", this.config.kafkaIPConnectionString) - environmentVariables.put("SCHEMA_REGISTRY_URL", this.config.schemaRegistryConnectionString) + //environmentVariables.put("KAFKA_BOOTSTRAP_SERVERS", this.config.kafkaIPConnectionString) + //environmentVariables.put("SCHEMA_REGISTRY_URL", this.config.schemaRegistryConnectionString) // setup deployment @@ -89,9 +89,9 @@ class UC1Benchmark(config: UC1BenchmarkConfig) : Benchmark(config) { // TODO ("calculate number of required instances") val requiredInstances: Int = 1 val environmentVariables: MutableMap<String, String> = mutableMapOf() - environmentVariables.put("KAFKA_BOOTSTRAP_SERVERS", this.config.kafkaIPConnectionString) - environmentVariables.put("ZK_HOST", this.config.zookeeperConnectionString.split(":")[0]) - environmentVariables.put("ZK_PORT", this.config.zookeeperConnectionString.split(":")[1]) + //environmentVariables.put("KAFKA_BOOTSTRAP_SERVERS", this.config.kafkaIPConnectionString) + //environmentVariables.put("ZK_HOST", this.config.zookeeperConnectionString.split(":")[0]) + //environmentVariables.put("ZK_PORT", this.config.zookeeperConnectionString.split(":")[1]) environmentVariables.put("NUM_SENSORS", load.get().toString()) environmentVariables.put("INSTANCES", requiredInstances.toString()) diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/k8s/WorkloadGeneratorStateCleaner.kt b/theodolite-quarkus/src/main/kotlin/theodolite/k8s/WorkloadGeneratorStateCleaner.kt index ec94e32c4dbfd0015dfc5f48ca811c7ea8ce0f10..fdc953116f4032ba41e75af6ba1e8a1082ddb212 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/k8s/WorkloadGeneratorStateCleaner.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/k8s/WorkloadGeneratorStateCleaner.kt @@ -1,10 +1,14 @@ package theodolite.k8s +import mu.KotlinLogging import org.apache.zookeeper.KeeperException import org.apache.zookeeper.WatchedEvent import org.apache.zookeeper.Watcher import org.apache.zookeeper.ZooKeeper +private val logger = KotlinLogging.logger {} + + class WorkloadGeneratorStateCleaner(ip: String) { val path = "/workload-generation" val sessionTimeout = 60 @@ -16,7 +20,7 @@ class WorkloadGeneratorStateCleaner(ip: String) { val watcher: Watcher = ZookeperWatcher() // defined below zookeeperClient = ZooKeeper(ip, sessionTimeout, watcher) } catch (e: Exception) { - System.out.println(e.toString()) + logger.error {e.toString()} } } @@ -28,7 +32,7 @@ class WorkloadGeneratorStateCleaner(ip: String) { try { zookeeperClient.delete(path, -1) } catch (ex: Exception) { - System.out.println(ex.toString()) + logger.error {ex.toString()} } try { @@ -42,15 +46,15 @@ class WorkloadGeneratorStateCleaner(ip: String) { deleted = true } is InterruptedException -> { - System.out.println(ex.toString()) + logger.error {ex.toString()} } } } Thread.sleep(retryTime) - System.out.println("ZooKeeper reset was not successful. Retrying in 5s") + logger.info {"ZooKeeper reset was not successful. Retrying in 5s"} } - System.out.println("ZooKeeper reset was successful") + logger.info {"ZooKeeper reset was successful"} } private class ZookeperWatcher : Watcher { diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/RestrictionStrategy.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/RestrictionStrategy.kt index 60a6eccfb37e5941455f3fc33876092a2317276a..5bef38aaf3e5ff446a839703e425f9dd3c5e22d8 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/RestrictionStrategy.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/RestrictionStrategy.kt @@ -5,5 +5,5 @@ import theodolite.util.LoadDimension import theodolite.util.Resource abstract class RestrictionStrategy(val results: Results) { - public abstract fun next(load: LoadDimension, resources: List<Resource>): List<Resource>; + public abstract fun next(load: LoadDimension, resources: List<Resource>): List<Resource> } \ No newline at end of file diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt index a1e1c8f3f112519fa46ccbe139e07ba7a591223b..3c6fc2eee9a9bde99682633d0922d9a06629875f 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt @@ -7,7 +7,7 @@ import theodolite.util.Results import java.lang.IllegalArgumentException class BinarySearch(benchmarkExecutor: BenchmarkExecutor, results: Results) : SearchStrategy(benchmarkExecutor, results) { - override fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource? { + override fun findSuitableResource(load: LoadDimension, resources: List<Resource>): Resource? { val result = search(load, resources, 0, resources.size - 1) if( result == -1 ) { return null; @@ -19,22 +19,23 @@ class BinarySearch(benchmarkExecutor: BenchmarkExecutor, results: Results) : Sea if (lower > upper) { throw IllegalArgumentException() } - if (lower == upper ) { - if (this.benchmarkExecutor.runExperiment(load, resources[lower])) return lower; + // special case: length == 1 or 2 + if (lower == upper) { + if (this.benchmarkExecutor.runExperiment(load, resources[lower])) return lower else { if (lower + 1 == resources.size) return - 1 - return lower + 1; + return lower + 1 } } else { - // (true, true), (false, true), (false, false) // (false, false, false, true, false, true, false, true) + // apply binary search for a list with length > 2 and adjust upper and lower depending on the result for `resources[mid]` val mid = (upper + lower) / 2 if (this.benchmarkExecutor.runExperiment(load, resources[mid])) { if (mid == lower) { return lower } - return search(load, resources, lower, mid - 1 ); + return search(load, resources, lower, mid - 1 ) } else { - return search(load, resources, mid + 1 , upper); + return search(load, resources, mid + 1 , upper) } } } diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt index ed8750083881f72a091c0acd923ef7c46ff79db7..20033a1d5084921f7d033dd3f5cb7cca6409c90c 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt @@ -8,11 +8,11 @@ import theodolite.util.Results class CompositeStrategy(benchmarkExecutor: BenchmarkExecutor, val searchStrategy: SearchStrategy, val restrictionStrategies: Set<RestrictionStrategy>, results: Results) : SearchStrategy(benchmarkExecutor, results) { - override fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource? { + override fun findSuitableResource(load: LoadDimension, resources: List<Resource>): Resource? { var restrictedResources = resources.toList() for (strategy in this.restrictionStrategies) { restrictedResources = restrictedResources.intersect(strategy.next(load, resources)).toList() } - return this.searchStrategy.findSuitableResources(load, restrictedResources) + return this.searchStrategy.findSuitableResource(load, restrictedResources) } } \ No newline at end of file diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt index 37fa4ca41678c285bb4fb6a86633dedecb78ba03..abbedf3c0acc1e1de4afc59b7a9c526a05928783 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt @@ -7,7 +7,7 @@ import theodolite.util.Results class LinearSearch(benchmarkExecutor: BenchmarkExecutor, results: Results) : SearchStrategy(benchmarkExecutor, results) { - override fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource? { + override fun findSuitableResource(load: LoadDimension, resources: List<Resource>): Resource? { for (res in resources) { if (this.benchmarkExecutor.runExperiment(load, res)) return res } diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt index 7e151ef6f3cfaf16a48c43f7369bbfc8041e9295..2b0143c52ecbfc6fc140841d3e0166b13a87a44d 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt @@ -6,5 +6,5 @@ import theodolite.util.Resource import theodolite.util.Results abstract class SearchStrategy(val benchmarkExecutor: BenchmarkExecutor, val results: Results) { - abstract fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource?; + abstract fun findSuitableResource(load: LoadDimension, resources: List<Resource>): Resource?; } \ No newline at end of file diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/TestBenchmark.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/TestBenchmark.kt index 816bd65f14af9e7064c79c736cba135c6779f728..3e6cf2396708d4af72c178a81517a2c620ad4061 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/util/TestBenchmark.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/TestBenchmark.kt @@ -1,15 +1,37 @@ package theodolite.util -//class TestBenchmark: Benchmark(config = emptyMap()) { -// override fun start() { -// TODO("Not yet implemented") -// } -// -// override fun clearClusterEnvironment() { -// TODO("Not yet implemented") -// } -// -// override fun startWorkloadGenerator(wg: String, dimValue: Int, ucId: String) { -// TODO("Not yet implemented") -// } -//} \ No newline at end of file +import theodolite.k8s.UC1Benchmark + +class TestBenchmark : Benchmark( + UC1Benchmark.UC1BenchmarkConfig( + zookeeperConnectionString = "", + kafkaIPConnectionString = "", + schemaRegistryConnectionString = "", + kafkaTopics = emptyList(), + kafkaReplication = 0, + kafkaPartition = 0, + ucServicePath = "", + ucDeploymentPath = "", + wgDeploymentPath = "", + configMapPath = "", + ucImageURL = "", + wgImageURL = "" + ) +) { + + override fun initializeClusterEnvironment() { + TODO("Not yet implemented") + } + + override fun clearClusterEnvironment() { + TODO("Not yet implemented") + } + + override fun startSUT(resources: Resource) { + TODO("Not yet implemented") + } + + override fun startWorkloadGenerator(load: LoadDimension) { + TODO("Not yet implemented") + } +} diff --git a/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt b/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt index 0f9b1b850b9963aa9e9851f963e4f02abcf09924..a9961d69bc22b8321577f1c7bb9bc37965f67360 100644 --- a/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt +++ b/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt @@ -40,7 +40,7 @@ class CompositeStrategyTest { expected.add(null) for(load in mockLoads) { - actual.add(strategy.findSuitableResources(load, mockResources)) + actual.add(strategy.findSuitableResource(load, mockResources)) } assertEquals(actual, expected) @@ -71,7 +71,7 @@ class CompositeStrategyTest { expected.add(null) for(load in mockLoads) { - actual.add(strategy.findSuitableResources(load, mockResources)) + actual.add(strategy.findSuitableResource(load, mockResources)) } assertEquals(actual, expected) @@ -101,7 +101,7 @@ class CompositeStrategyTest { val expected: ArrayList<Resource?> = ArrayList(listOf(0,2,2,3,4,6,7).map{ x -> Resource(x)}) for(load in mockLoads) { - actual.add(strategy.findSuitableResources(load, mockResources)) + actual.add(strategy.findSuitableResource(load, mockResources)) } assertEquals(actual, expected)