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

Fix ConfigMapResourceSet test

parent b6ca11ee
No related branches found
No related tags found
1 merge request!257Allow Theodolite to deploy arbitrary resources
Pipeline #7072 failed
package theodolite.benchmark package theodolite.benchmark
import com.google.gson.Gson import com.fasterxml.jackson.databind.ObjectMapper
import io.fabric8.kubernetes.api.model.* import io.fabric8.kubernetes.api.model.*
import io.fabric8.kubernetes.api.model.apps.Deployment import io.fabric8.kubernetes.api.model.apps.Deployment
import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder
import io.fabric8.kubernetes.api.model.apps.StatefulSet import io.fabric8.kubernetes.api.model.apps.StatefulSet
import io.fabric8.kubernetes.api.model.apps.StatefulSetBuilder import io.fabric8.kubernetes.api.model.apps.StatefulSetBuilder
import io.fabric8.kubernetes.client.dsl.MixedOperation
import io.fabric8.kubernetes.client.dsl.Resource
import io.fabric8.kubernetes.client.dsl.base.ResourceDefinitionContext
import io.fabric8.kubernetes.client.server.mock.KubernetesServer import io.fabric8.kubernetes.client.server.mock.KubernetesServer
import io.quarkus.test.junit.QuarkusTest import io.quarkus.test.junit.QuarkusTest
import io.quarkus.test.kubernetes.client.KubernetesTestServer
import io.quarkus.test.kubernetes.client.WithKubernetesTestServer
import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows import org.junit.jupiter.api.assertThrows
import theodolite.k8s.CustomResourceWrapper import org.mockito.kotlin.mock
import theodolite.k8s.resourceLoader.K8sResourceLoaderFromFile import registerResource
import theodolite.TestBenchmark
import theodolite.execution.operator.BenchmarkCRDummy
import theodolite.execution.operator.ExecutionClient
import theodolite.execution.operator.ExecutionEventHandler
import theodolite.execution.operator.ExecutionStateHandler
import theodolite.model.crd.BenchmarkCRD
import theodolite.model.crd.ExecutionCRD
import theodolite.util.DeploymentFailedException import theodolite.util.DeploymentFailedException
import java.io.FileInputStream
private const val testResourcePath = "./src/test/resources/k8s-resource-files/" // TODO move somewhere else
typealias BenchmarkClient = MixedOperation<BenchmarkCRD, KubernetesResourceList<BenchmarkCRD>, Resource<BenchmarkCRD>>
@QuarkusTest @QuarkusTest
class ConfigMapResourceSetTest { @WithKubernetesTestServer
private val server = KubernetesServer(false, true) internal class ConfigMapResourceSetTest {
@KubernetesTestServer
private lateinit var server: KubernetesServer
private val objectMapper: ObjectMapper = ObjectMapper()
private lateinit var executionClient: ExecutionClient
private lateinit var benchmarkClient: BenchmarkClient
@BeforeEach @BeforeEach
fun setUp() { fun setUp() {
server.before() server.before()
this.server.client
.apiextensions().v1()
.customResourceDefinitions()
.load(FileInputStream("crd/crd-execution.yaml"))
.create()
this.server.client
.apiextensions().v1()
.customResourceDefinitions()
.load(FileInputStream("crd/crd-benchmark.yaml"))
.create()
this.executionClient = this.server.client.resources(ExecutionCRD::class.java)
this.benchmarkClient = this.server.client.resources(BenchmarkCRD::class.java)
} }
@AfterEach @AfterEach
...@@ -34,184 +69,194 @@ class ConfigMapResourceSetTest { ...@@ -34,184 +69,194 @@ class ConfigMapResourceSetTest {
server.after() server.after()
} }
fun deployAndGetResource(resource: String): Collection<Pair<String, KubernetesResource>> { private fun deployAndGetResource(vararg resources: HasMetadata): ConfigMapResourceSet {
val configMap1 = ConfigMapBuilder() val configMap = ConfigMapBuilder()
.withNewMetadata().withName("test-configmap").endMetadata() .withNewMetadata().withName("test-configmap").endMetadata()
.addToData("test-resource.yaml",resource) .let {
resources.foldIndexed(it) {
i, b, r -> b.addToData("resource_$i.yaml", objectMapper.writeValueAsString(r))
}
}
.build() .build()
server.client.configMaps().createOrReplace(configMap1) server.client.configMaps().createOrReplace(configMap)
val resourceSet = ConfigMapResourceSet() val resourceSet = ConfigMapResourceSet()
resourceSet.name = "test-configmap" resourceSet.name = "test-configmap"
return resourceSet.getResourceSet(server.client) return resourceSet
} }
@Test @Test
fun testLoadDeployment() { fun testLoadDeployment() {
val resourceBuilder = DeploymentBuilder() val resource = DeploymentBuilder()
resourceBuilder.withNewSpec().endSpec() .withNewSpec()
resourceBuilder.withNewMetadata().endMetadata() .endSpec()
val resource = resourceBuilder.build() .withNewMetadata()
resource.metadata.name = "test-deployment" .withName("test-deployment")
.endMetadata()
.build()
val createdResource = deployAndGetResource(resource = Gson().toJson(resource)) val createdResource = deployAndGetResource(resource).getResourceSet(server.client)
assertEquals(1, createdResource.size) assertEquals(1, createdResource.size)
assertTrue(createdResource.toMutableSet().first().second is Deployment) assertTrue(createdResource.toList().first().second is Deployment)
assertTrue(createdResource.toMutableSet().first().second.toString().contains(other = resource.metadata.name)) assertTrue(createdResource.toList().first().second.toString().contains(other = resource.metadata.name))
} }
@Test @Test
fun testLoadStateFulSet() { fun testLoadStateFulSet() {
val resourceBuilder = StatefulSetBuilder() val resource = StatefulSetBuilder()
resourceBuilder.withNewSpec().endSpec() .withNewSpec()
resourceBuilder.withNewMetadata().endMetadata() .endSpec()
val resource = resourceBuilder.build() .withNewMetadata()
resource.metadata.name = "test-resource" .withName("test-sts")
.endMetadata()
.build()
val createdResource = deployAndGetResource(resource = Gson().toJson(resource)) val createdResource = deployAndGetResource(resource).getResourceSet(server.client)
assertEquals(1, createdResource.size) assertEquals(1, createdResource.size)
assertTrue(createdResource.toMutableSet().first().second is StatefulSet) assertTrue(createdResource.toList().first().second is StatefulSet)
assertTrue(createdResource.toMutableSet().first().second.toString().contains(other = resource.metadata.name)) assertTrue(createdResource.toList().first().second.toString().contains(other = resource.metadata.name))
} }
@Test @Test
fun testLoadService() { fun testLoadService() {
val resourceBuilder = ServiceBuilder() val resource = ServiceBuilder()
resourceBuilder.withNewSpec().endSpec() .withNewSpec()
resourceBuilder.withNewMetadata().endMetadata() .endSpec()
val resource = resourceBuilder.build() .withNewMetadata()
resource.metadata.name = "test-resource" .withName("test-service")
.endMetadata()
.build()
val createdResource = deployAndGetResource(resource = Gson().toJson(resource)) val createdResource = deployAndGetResource(resource).getResourceSet(server.client)
assertEquals(1, createdResource.size) assertEquals(1, createdResource.size)
assertTrue(createdResource.toMutableSet().first().second is Service) assertTrue(createdResource.toList().first().second is Service)
assertTrue(createdResource.toMutableSet().first().second.toString().contains(other = resource.metadata.name)) assertTrue(createdResource.toList().first().second.toString().contains(other = resource.metadata.name))
} }
@Test @Test
fun testLoadConfigMap() { fun testLoadConfigMap() {
val resourceBuilder = ConfigMapBuilder() val resource = ConfigMapBuilder()
resourceBuilder.withNewMetadata().endMetadata() .withNewMetadata()
val resource = resourceBuilder.build() .withName("test-configmap")
resource.metadata.name = "test-resource" .endMetadata()
.build()
val createdResource = deployAndGetResource(resource = Gson().toJson(resource)) val createdResource = deployAndGetResource(resource).getResourceSet(server.client)
assertEquals(1, createdResource.size) assertEquals(1, createdResource.size)
assertTrue(createdResource.toMutableSet().first().second is ConfigMap) assertTrue(createdResource.toList().first().second is ConfigMap)
assertTrue(createdResource.toMutableSet().first().second.toString().contains(other = resource.metadata.name)) assertTrue(createdResource.toList().first().second.toString().contains(other = resource.metadata.name))
} }
@Test @Test
fun testLoadExecution() { fun testLoadExecution() {
val loader = K8sResourceLoaderFromFile(server.client) val stream = javaClass.getResourceAsStream("/k8s-resource-files/test-execution.yaml")
val resource = loader.loadK8sResource("Execution", testResourcePath + "test-execution.yaml") as CustomResourceWrapper val execution = this.executionClient.load(stream).get()
val createdResource = deployAndGetResource(resource = Gson().toJson(resource.crAsMap)) val createdResource = deployAndGetResource(execution).getResourceSet(server.client)
assertEquals(1, createdResource.size) assertEquals(1, createdResource.size)
assertTrue(createdResource.toMutableSet().first().second is CustomResourceWrapper) val loadedResource = createdResource.toList().first().second
assertTrue(loadedResource is ExecutionCRD)
val loadedResource = createdResource.toMutableSet().first().second assertEquals("example-execution", loadedResource.metadata.name)
if (loadedResource is CustomResourceWrapper){
assertTrue(loadedResource.getName() == "example-execution")
}
} }
@Test @Test
fun testLoadBenchmark() { fun testLoadBenchmark() {
val loader = K8sResourceLoaderFromFile(server.client) val benchmark = BenchmarkCRDummy("example-benchmark").getCR()
val resource = loader.loadK8sResource("Benchmark", testResourcePath + "test-benchmark.yaml") as CustomResourceWrapper val createdResource = deployAndGetResource(benchmark).getResourceSet(server.client)
val createdResource = deployAndGetResource(resource = Gson().toJson(resource.crAsMap))
assertEquals(1, createdResource.size) assertEquals(1, createdResource.size)
assertTrue(createdResource.toMutableSet().first().second is CustomResourceWrapper) val loadedResource = createdResource.toList().first().second
assertTrue(loadedResource is BenchmarkCRD)
val loadedResource = createdResource.toMutableSet().first().second assertEquals("example-benchmark", loadedResource.metadata.name)
if (loadedResource is CustomResourceWrapper){
assertTrue(loadedResource.getName() == "example-benchmark")
}
} }
@Test @Test
fun testLoadServiceMonitor() { fun testLoadServiceMonitor() {
val loader = K8sResourceLoaderFromFile(server.client) val serviceMonitorContext = ResourceDefinitionContext.Builder()
val resource = loader.loadK8sResource("ServiceMonitor", testResourcePath + "test-service-monitor.yaml") as CustomResourceWrapper .withGroup("monitoring.coreos.com")
val createdResource = deployAndGetResource(resource = Gson().toJson(resource.crAsMap)) .withKind("ServiceMonitor")
.withPlural("servicemonitors")
.withNamespaced(true)
.withVersion("v1")
.build()
server.registerResource(serviceMonitorContext)
assertEquals(1, createdResource.size) val stream = javaClass.getResourceAsStream("/k8s-resource-files/test-service-monitor.yaml")
assertTrue(createdResource.toMutableSet().first().second is CustomResourceWrapper) val serviceMonitor = server.client.load(stream).get()[0]
val createdResource = deployAndGetResource(serviceMonitor).getResourceSet(server.client)
val loadedResource = createdResource.toMutableSet().first().second assertEquals(1, createdResource.size)
if (loadedResource is CustomResourceWrapper){ val loadedResource = createdResource.toList().first().second
assertTrue(loadedResource.getName() == "test-service-monitor") assertTrue(loadedResource is GenericKubernetesResource)
} assertEquals("ServiceMonitor", loadedResource.kind)
assertEquals("test-service-monitor", loadedResource.metadata.name)
} }
@Test @Test
fun testMultipleFiles(){ fun testMultipleFiles(){
val resourceBuilder = DeploymentBuilder() val deployment = DeploymentBuilder()
resourceBuilder.withNewSpec().endSpec() .withNewSpec()
resourceBuilder.withNewMetadata().endMetadata() .endSpec()
val resource = resourceBuilder.build() .withNewMetadata()
resource.metadata.name = "test-deployment" .withName("test-deployment")
.endMetadata()
val resourceBuilder1 = ConfigMapBuilder() .build()
resourceBuilder1.withNewMetadata().endMetadata() val configMap = ConfigMapBuilder()
val resource1 = resourceBuilder1.build() .withNewMetadata()
resource1.metadata.name = "test-configmap" .withName("test-configmap")
.endMetadata()
val configMap1 = ConfigMapBuilder()
.withNewMetadata().withName("test-configmap").endMetadata()
.addToData("test-deployment.yaml",Gson().toJson(resource))
.addToData("test-configmap.yaml",Gson().toJson(resource1))
.build() .build()
server.client.configMaps().createOrReplace(configMap1) val createdResourceSet = deployAndGetResource(deployment, configMap).getResourceSet(server.client)
val resourceSet = ConfigMapResourceSet()
resourceSet.name = "test-configmap"
val createdResourcesSet = resourceSet.getResourceSet(server.client)
assertEquals(2,createdResourcesSet.size ) assertEquals(2, createdResourceSet.size )
assert(createdResourcesSet.toMutableList()[0].second is Deployment) assert(createdResourceSet.toList()[0].second is Deployment)
assert(createdResourcesSet.toMutableList()[1].second is ConfigMap) assert(createdResourceSet.toList()[1].second is ConfigMap)
} }
@Test @Test
fun testFileIsSet(){ fun testFilesRestricted() {
val resourceBuilder = DeploymentBuilder() val deployment = DeploymentBuilder()
resourceBuilder.withNewSpec().endSpec() .withNewSpec()
resourceBuilder.withNewMetadata().endMetadata() .endSpec()
val resource = resourceBuilder.build() .withNewMetadata()
resource.metadata.name = "test-deployment" .withName("test-deployment")
.endMetadata()
val resourceBuilder1 = ConfigMapBuilder() .build()
resourceBuilder1.withNewMetadata().endMetadata() val configMap = ConfigMapBuilder()
val resource1 = resourceBuilder1.build() .withNewMetadata()
resource1.metadata.name = "test-configmap" .withName("test-configmap")
.endMetadata()
val configMap1 = ConfigMapBuilder()
.withNewMetadata().withName("test-configmap").endMetadata()
.addToData("test-deployment.yaml",Gson().toJson(resource))
.addToData("test-configmap.yaml",Gson().toJson(resource1))
.build() .build()
server.client.configMaps().createOrReplace(configMap1) val createdResourceSet = deployAndGetResource(deployment, configMap)
val allResources = createdResourceSet.getResourceSet(server.client)
val resourceSet = ConfigMapResourceSet() assertEquals(2, allResources.size)
resourceSet.name = "test-configmap" createdResourceSet.files = listOf(allResources.first().first) // only select first file from ConfigMa
resourceSet.files = listOf("test-deployment.yaml") val resources = createdResourceSet.getResourceSet(server.client)
assertEquals(1, resources.size)
assertTrue(resources.toList().first().second is Deployment)
}
val createdResourcesSet = resourceSet.getResourceSet(server.client) @Test
fun testFileNotExist() {
val resource = DeploymentBuilder()
.withNewSpec()
.endSpec()
.withNewMetadata()
.withName("test-deployment")
.endMetadata()
.build()
assertEquals(1, createdResourcesSet.size ) val resourceSet = deployAndGetResource(resource)
assert(createdResourcesSet.toMutableSet().first().second is Deployment) resourceSet.files = listOf("non-existing-file.yaml")
assertThrows<DeploymentFailedException> {
resourceSet.getResourceSet(server.client)
}
} }
@Test @Test
fun testConfigMapNotExist() { fun testConfigMapNotExist() {
val resourceSet = ConfigMapResourceSet() val resourceSet = ConfigMapResourceSet()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment