Last active
January 27, 2021 20:35
-
-
Save rcapraro/e5bccfc55bdd66c64c5921df18aab00e to your computer and use it in GitHub Desktop.
App CRD creation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package io.saagie.application | |
import com.fasterxml.jackson.annotation.JsonInclude | |
import com.fasterxml.jackson.module.kotlin.kotlinModule | |
import io.fabric8.kubernetes.api.model.Namespaced | |
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder | |
import io.fabric8.kubernetes.client.CustomResource | |
import io.fabric8.kubernetes.client.CustomResourceList | |
import io.fabric8.kubernetes.client.DefaultKubernetesClient | |
import io.fabric8.kubernetes.client.Watcher | |
import io.fabric8.kubernetes.client.WatcherException | |
import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext | |
import io.fabric8.kubernetes.client.utils.Serialization | |
import io.fabric8.kubernetes.model.annotation.Group | |
import io.fabric8.kubernetes.model.annotation.Version | |
import java.util.UUID | |
@Group("saagie.io") | |
@Version("v1") | |
class Application(metaName: String?, spec: ApplicationSpec) : CustomResource<ApplicationSpec, ApplicationStatus>(), Namespaced { | |
init { | |
metadata = ObjectMetaBuilder().withName(metaName).build() | |
setSpec(spec) | |
} | |
} | |
class ApplicationList : CustomResourceList<Application>() | |
@JsonInclude(JsonInclude.Include.NON_NULL) | |
data class ApplicationSpec( | |
val id: String, | |
val image: String, | |
val ports: List<Port>, | |
val volumes: List<Volume>? | |
) | |
@JsonInclude(JsonInclude.Include.NON_NULL) | |
data class Port(val number: Int, val protocol: String, val name: String, val rewrite: Boolean, val basePath: String?, val authentication: String?) | |
data class Volume(val pvcName: String, val mountPath: String) | |
data class ApplicationStatus(val code: String) | |
fun main() { | |
val client = DefaultKubernetesClient() | |
Serialization.jsonMapper().registerModule(kotlinModule()) | |
val applicationCrd = client | |
.apiextensions().v1().customResourceDefinitions() | |
.load(Application::class.java.getResourceAsStream("/saagie.io_applications.yaml")).get() | |
val applicationClient = client | |
.customResources(CustomResourceDefinitionContext.fromCrd(applicationCrd), Application::class.java, ApplicationList::class.java) | |
.inNamespace("saagie1-project-xxx") | |
val appName = UUID.randomUUID().toString() | |
applicationClient.create( | |
Application( | |
appName, ApplicationSpec( | |
id = appName, | |
image = "saagie/jupyter-python-nbk:v2", | |
ports = listOf( | |
Port( | |
number = 8888, | |
protocol = "http", | |
name = "http", | |
rewrite = false, | |
basePath = "SAAGIE_BASE_PATH", | |
authentication = null | |
) | |
), | |
volumes = null | |
) | |
) | |
) | |
val appList: CustomResourceList<Application> = applicationClient.list() | |
val items: List<Application> = appList.items | |
println("Found $items.size Applications:") | |
items.forEach { app -> println(app.spec.id) } | |
applicationClient.watch(object : Watcher<Application> { | |
override fun eventReceived(action: Watcher.Action?, resource: Application?) { | |
println("Watch event received $action.name()") | |
println("Application status: ${resource?.status?.code}") | |
} | |
override fun onClose(cause: WatcherException?) { | |
println("Watch error received ${cause?.message}") | |
} | |
}) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment