Skip to content
Snippets Groups Projects
Commit 48b944d6 authored by Sören Henning's avatar Sören Henning
Browse files

Merge branch 'refactoring' into 'theodolite-kotlin'

Refactoring

See merge request !134
parents 4fbbd147 e1dc401d
No related branches found
No related tags found
4 merge requests!159Re-implementation of Theodolite with Kotlin/Quarkus,!157Update Graal Image in CI pipeline,!134Refactoring,!83WIP: Re-implementation of Theodolite with Kotlin/Quarkus
Pipeline #2967 canceled
Showing
with 53 additions and 43 deletions
...@@ -22,7 +22,7 @@ private var DEFAULT_NAMESPACE = "default" ...@@ -22,7 +22,7 @@ private var DEFAULT_NAMESPACE = "default"
* - [loadGenResource] resource that generates the load, * - [loadGenResource] resource that generates the load,
* - [resourceTypes] types of scaling resources, * - [resourceTypes] types of scaling resources,
* - [loadTypes] types of loads that can be scaled for the benchmark, * - [loadTypes] types of loads that can be scaled for the benchmark,
* - [kafkaConfig] for the [TopicManager], * - [kafkaConfig] for the [theodolite.k8s.TopicManager],
* - [namespace] for the client, * - [namespace] for the client,
* - [path] under which the resource yamls can be found. * - [path] under which the resource yamls can be found.
* *
...@@ -63,7 +63,7 @@ class KubernetesBenchmark : Benchmark, CustomResource(), Namespaced { ...@@ -63,7 +63,7 @@ class KubernetesBenchmark : Benchmark, CustomResource(), Namespaced {
* First loads all required resources and then patches them to the concrete load and resources for the experiment. * First loads all required resources and then patches them to the concrete load and resources for the experiment.
* Afterwards patches additional configurations(cluster depending) into the resources. * Afterwards patches additional configurations(cluster depending) into the resources.
* @param load concrete load that will be benchmarked in this experiment. * @param load concrete load that will be benchmarked in this experiment.
* @param res concrete resoruce that will be scaled for this experiment. * @param res concrete resource that will be scaled for this experiment.
* @param configurationOverrides * @param configurationOverrides
* @return a [BenchmarkDeployment] * @return a [BenchmarkDeployment]
*/ */
......
...@@ -4,7 +4,7 @@ import theodolite.util.PrometheusResponse ...@@ -4,7 +4,7 @@ import theodolite.util.PrometheusResponse
import java.time.Instant import java.time.Instant
/** /**
* A SloChecker can be used to evaluate data from Promehteus. * A SloChecker can be used to evaluate data from Prometheus.
* @constructor Creates an empty SloChecker * @constructor Creates an empty SloChecker
*/ */
interface SloChecker { interface SloChecker {
......
...@@ -3,6 +3,7 @@ package theodolite.execution.operator ...@@ -3,6 +3,7 @@ package theodolite.execution.operator
import io.fabric8.kubernetes.client.informers.ResourceEventHandler import io.fabric8.kubernetes.client.informers.ResourceEventHandler
import mu.KotlinLogging import mu.KotlinLogging
import theodolite.benchmark.KubernetesBenchmark import theodolite.benchmark.KubernetesBenchmark
private val logger = KotlinLogging.logger {} private val logger = KotlinLogging.logger {}
/** /**
......
...@@ -3,7 +3,6 @@ package theodolite.execution.operator ...@@ -3,7 +3,6 @@ package theodolite.execution.operator
import io.fabric8.kubernetes.client.informers.ResourceEventHandler import io.fabric8.kubernetes.client.informers.ResourceEventHandler
import mu.KotlinLogging import mu.KotlinLogging
import theodolite.benchmark.BenchmarkExecution import theodolite.benchmark.BenchmarkExecution
import java.lang.NullPointerException
private val logger = KotlinLogging.logger {} private val logger = KotlinLogging.logger {}
...@@ -29,10 +28,12 @@ class ExecutionHandler(private val controller: TheodoliteController): ResourceEv ...@@ -29,10 +28,12 @@ class ExecutionHandler(private val controller: TheodoliteController): ResourceEv
} }
/** /**
* Update an execution. If this execution is running at the time this function is called, it is stopped and added to * Updates an execution. If this execution is running at the time this function is called, it is stopped and
* the beginning of the queue of the TheodoliteController. Otherwise, it is just added to the beginning of the queue. * added to the beginning of the queue of the TheodoliteController.
* Otherwise, it is just added to the beginning of the queue.
* *
* @param execution the execution to update * @param oldExecution the old execution
* @param newExecution the new execution
*/ */
override fun onUpdate(oldExecution: BenchmarkExecution, newExecution: BenchmarkExecution) { override fun onUpdate(oldExecution: BenchmarkExecution, newExecution: BenchmarkExecution) {
logger.info { "Add updated execution to queue." } logger.info { "Add updated execution to queue." }
......
...@@ -2,7 +2,6 @@ package theodolite.execution.operator ...@@ -2,7 +2,6 @@ package theodolite.execution.operator
import io.fabric8.kubernetes.client.NamespacedKubernetesClient import io.fabric8.kubernetes.client.NamespacedKubernetesClient
import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext
import khttp.patch
import mu.KotlinLogging import mu.KotlinLogging
import theodolite.benchmark.BenchmarkExecution import theodolite.benchmark.BenchmarkExecution
import theodolite.benchmark.KubernetesBenchmark import theodolite.benchmark.KubernetesBenchmark
......
...@@ -32,7 +32,14 @@ class K8sResourceLoader(private val client: NamespacedKubernetesClient) { ...@@ -32,7 +32,14 @@ class K8sResourceLoader(private val client: NamespacedKubernetesClient) {
* @return CustomResource from fabric8 * @return CustomResource from fabric8
*/ */
private fun loadServiceMonitor(path: String): ServiceMonitorWrapper { private fun loadServiceMonitor(path: String): ServiceMonitorWrapper {
return loadGenericResource(path) { x: String -> ServiceMonitorWrapper(YamlParser().parse(path, HashMap<String, String>()::class.java)!!) } return loadGenericResource(path) { x: String ->
ServiceMonitorWrapper(
YamlParser().parse(
path,
HashMap<String, String>()::class.java
)!!
)
}
} }
/** /**
......
...@@ -45,7 +45,7 @@ class TopicManager(private val kafkaConfig: Map<String, Any>) { ...@@ -45,7 +45,7 @@ class TopicManager(private val kafkaConfig: Map<String, Any>) {
"Topics creation finished with result: ${ "Topics creation finished with result: ${
result result
.values() .values()
.map { it -> it.key + ": " + it.value.isDone } .map { it.key + ": " + it.value.isDone }
.joinToString(separator = ",") .joinToString(separator = ",")
} " } "
} }
...@@ -64,11 +64,12 @@ class TopicManager(private val kafkaConfig: Map<String, Any>) { ...@@ -64,11 +64,12 @@ class TopicManager(private val kafkaConfig: Map<String, Any>) {
} }
/** /**
* This function checks whether one string in `topics` can be used as prefix of a regular expression to create the string `existingTopic` * This function checks whether one string in `topics` can be used as prefix of a regular expression
* to create the string `existingTopic`.
* *
* @param existingTopic string for which should be checked if it could be created * @param existingTopic string for which should be checked if it could be created.
* @param topics list of string which are used as possible prefixes to create `existingTopic` * @param topics list of string which are used as possible prefixes to create `existingTopic`.
* @return true, `existingTopics` matches a created regex, else false * @return true, `existingTopics` matches a created regex, else false.
*/ */
private fun matchRegex(existingTopic: String, topics: List<String>): Boolean { private fun matchRegex(existingTopic: String, topics: List<String>): Boolean {
for (t in topics) { for (t in topics) {
...@@ -89,7 +90,7 @@ class TopicManager(private val kafkaConfig: Map<String, Any>) { ...@@ -89,7 +90,7 @@ class TopicManager(private val kafkaConfig: Map<String, Any>) {
result.all().get() // wait for the future to be completed result.all().get() // wait for the future to be completed
logger.info { logger.info {
"Topics deletion finished with result: ${ "Topics deletion finished with result: ${
result.values().map { it -> it.key + ": " + it.value.isDone } result.values().map { it.key + ": " + it.value.isDone }
.joinToString(separator = ",") .joinToString(separator = ",")
}" }"
} }
......
...@@ -7,7 +7,8 @@ import kotlin.math.pow ...@@ -7,7 +7,8 @@ import kotlin.math.pow
private const val NUM_SENSORS = 4.0 private const val NUM_SENSORS = 4.0
private const val LOAD_GEN_MAX_RECORDS = 150000 private const val LOAD_GEN_MAX_RECORDS = 150000
class NumNestedGroupsLoadGeneratorReplicaPatcher(private val k8sResource: KubernetesResource) : AbstractPatcher(k8sResource) { class NumNestedGroupsLoadGeneratorReplicaPatcher(private val k8sResource: KubernetesResource) :
AbstractPatcher(k8sResource) {
override fun <String> patch(value: String) { override fun <String> patch(value: String) {
if (k8sResource is Deployment) { if (k8sResource is Deployment) {
if (value is kotlin.String) { if (value is kotlin.String) {
......
...@@ -5,7 +5,8 @@ import io.fabric8.kubernetes.api.model.apps.Deployment ...@@ -5,7 +5,8 @@ import io.fabric8.kubernetes.api.model.apps.Deployment
private const val LOAD_GEN_MAX_RECORDS = 150000 private const val LOAD_GEN_MAX_RECORDS = 150000
class NumSensorsLoadGeneratorReplicaPatcher(private val k8sResource: KubernetesResource) : AbstractPatcher(k8sResource) { class NumSensorsLoadGeneratorReplicaPatcher(private val k8sResource: KubernetesResource) :
AbstractPatcher(k8sResource) {
override fun <String> patch(value: String) { override fun <String> patch(value: String) {
if (k8sResource is Deployment) { if (k8sResource is Deployment) {
if (value is kotlin.String) { if (value is kotlin.String) {
......
...@@ -6,7 +6,6 @@ import io.fabric8.kubernetes.api.model.Quantity ...@@ -6,7 +6,6 @@ import io.fabric8.kubernetes.api.model.Quantity
import io.fabric8.kubernetes.api.model.ResourceRequirements import io.fabric8.kubernetes.api.model.ResourceRequirements
import io.fabric8.kubernetes.api.model.apps.Deployment import io.fabric8.kubernetes.api.model.apps.Deployment
import io.fabric8.kubernetes.api.model.apps.StatefulSet import io.fabric8.kubernetes.api.model.apps.StatefulSet
import java.lang.IllegalArgumentException
/** /**
* The Resource limit [Patcher] set resource limits for deployments and statefulSets. * The Resource limit [Patcher] set resource limits for deployments and statefulSets.
......
...@@ -6,7 +6,6 @@ import io.fabric8.kubernetes.api.model.Quantity ...@@ -6,7 +6,6 @@ import io.fabric8.kubernetes.api.model.Quantity
import io.fabric8.kubernetes.api.model.ResourceRequirements import io.fabric8.kubernetes.api.model.ResourceRequirements
import io.fabric8.kubernetes.api.model.apps.Deployment import io.fabric8.kubernetes.api.model.apps.Deployment
import io.fabric8.kubernetes.api.model.apps.StatefulSet import io.fabric8.kubernetes.api.model.apps.StatefulSet
import java.lang.IllegalArgumentException
/** /**
* The Resource request [Patcher] set resource limits for deployments and statefulSets. * The Resource request [Patcher] set resource limits for deployments and statefulSets.
......
...@@ -4,8 +4,8 @@ import io.fabric8.kubernetes.api.model.KubernetesResource ...@@ -4,8 +4,8 @@ import io.fabric8.kubernetes.api.model.KubernetesResource
import io.fabric8.kubernetes.api.model.apps.Deployment import io.fabric8.kubernetes.api.model.apps.Deployment
/** /**
* The Scheduler name [Patcher] make it possible to set the scheduler which should be used to deploy the given deployment. * The Scheduler name [Patcher] make it possible to set the scheduler which should
* * be used to deploy the given deployment.
* @param k8sResource Kubernetes resource to be patched. * @param k8sResource Kubernetes resource to be patched.
*/ */
class SchedulerNamePatcher(private val k8sResource: KubernetesResource) : Patcher { class SchedulerNamePatcher(private val k8sResource: KubernetesResource) : Patcher {
......
...@@ -10,7 +10,7 @@ import theodolite.util.Resource ...@@ -10,7 +10,7 @@ import theodolite.util.Resource
* Composite strategy that combines a SearchStrategy and a set of RestrictionStrategy. * Composite strategy that combines a SearchStrategy and a set of RestrictionStrategy.
* *
* @param searchStrategy the [SearchStrategy] that is executed as part of this [CompositeStrategy]. * @param searchStrategy the [SearchStrategy] that is executed as part of this [CompositeStrategy].
* @param restrictionStrategies the set of [RestrictionStrategy] that are connected conjuntively to restrict the [Resource] * @param restrictionStrategies the set of [RestrictionStrategy] that are connected conjunctive to restrict the [Resource]
* @param benchmarkExecutor Benchmark executor which runs the individual benchmarks. * @param benchmarkExecutor Benchmark executor which runs the individual benchmarks.
*/ */
@RegisterForReflection @RegisterForReflection
......
...@@ -18,7 +18,7 @@ private val logger = KotlinLogging.logger {} ...@@ -18,7 +18,7 @@ private val logger = KotlinLogging.logger {}
class FullSearch(benchmarkExecutor: BenchmarkExecutor) : SearchStrategy(benchmarkExecutor) { class FullSearch(benchmarkExecutor: BenchmarkExecutor) : SearchStrategy(benchmarkExecutor) {
override fun findSuitableResource(load: LoadDimension, resources: List<Resource>): Resource? { override fun findSuitableResource(load: LoadDimension, resources: List<Resource>): Resource? {
var minimalSuitableResources: Resource? = null; var minimalSuitableResources: Resource? = null
for (res in resources) { for (res in resources) {
logger.info { "Running experiment with load '${load.get()}' and resources '${res.get()}'" } logger.info { "Running experiment with load '${load.get()}' and resources '${res.get()}'" }
val result = this.benchmarkExecutor.runExperiment(load, res) val result = this.benchmarkExecutor.runExperiment(load, res)
......
...@@ -2,7 +2,7 @@ package theodolite.util ...@@ -2,7 +2,7 @@ package theodolite.util
import com.fasterxml.jackson.databind.annotation.JsonDeserialize import com.fasterxml.jackson.databind.annotation.JsonDeserialize
import io.quarkus.runtime.annotations.RegisterForReflection import io.quarkus.runtime.annotations.RegisterForReflection
import org.apache.kafka.clients.admin.NewTopic import theodolite.util.KafkaConfig.TopicWrapper
import kotlin.properties.Delegates import kotlin.properties.Delegates
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
...@@ -60,6 +60,7 @@ class DelegatesFalse { ...@@ -60,6 +60,7 @@ class DelegatesFalse {
operator fun getValue(thisRef: Any?, property: KProperty<*>): Boolean { operator fun getValue(thisRef: Any?, property: KProperty<*>): Boolean {
return state return state
} }
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) { operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) {
state = value state = value
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment