Skip to content

Instantly share code, notes, and snippets.

@rcapraro
Last active January 27, 2021 20:35
Show Gist options
  • Save rcapraro/e5bccfc55bdd66c64c5921df18aab00e to your computer and use it in GitHub Desktop.
Save rcapraro/e5bccfc55bdd66c64c5921df18aab00e to your computer and use it in GitHub Desktop.
App CRD creation
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