11package eu.openanalytics.shinyproxyoperator.controller
22
33import eu.openanalytics.shinyproxyoperator.components.ConfigMapFactory
4+ import eu.openanalytics.shinyproxyoperator.components.LabelFactory
45import eu.openanalytics.shinyproxyoperator.components.ReplicaSetFactory
56import eu.openanalytics.shinyproxyoperator.components.ServiceFactory
7+ import eu.openanalytics.shinyproxyoperator.crd.DoneableShinyProxy
68import eu.openanalytics.shinyproxyoperator.crd.ShinyProxy
9+ import eu.openanalytics.shinyproxyoperator.crd.ShinyProxyInstance
10+ import eu.openanalytics.shinyproxyoperator.crd.ShinyProxyList
711import io.fabric8.kubernetes.api.model.ConfigMap
812import io.fabric8.kubernetes.api.model.Service
913import io.fabric8.kubernetes.api.model.apps.ReplicaSet
1014import io.fabric8.kubernetes.client.KubernetesClient
15+ import io.fabric8.kubernetes.client.dsl.MixedOperation
16+ import io.fabric8.kubernetes.client.dsl.Resource
1117import io.fabric8.kubernetes.client.informers.SharedIndexInformer
1218import io.fabric8.kubernetes.client.informers.cache.Lister
1319import kotlinx.coroutines.channels.Channel
1420import mu.KotlinLogging
1521
1622
1723class ShinyProxyController (private val kubernetesClient : KubernetesClient ,
24+ private val shinyProxyClient : MixedOperation <ShinyProxy , ShinyProxyList , DoneableShinyProxy , Resource <ShinyProxy , DoneableShinyProxy >>,
1825 private val replicaSetInformer : SharedIndexInformer <ReplicaSet >,
1926 serviceInformer : SharedIndexInformer <Service >,
2027 configMapInformer : SharedIndexInformer <ConfigMap >,
2128 private val shinyProxyInformer : SharedIndexInformer <ShinyProxy >,
2229 namespace : String ) {
2330
24- private val workqueue = Channel <ShinyProxyEvent >()
31+ private val workqueue = Channel <ShinyProxyEvent >(10000 )
2532 private val shinyProxyLister = Lister (shinyProxyInformer.indexer, namespace)
2633 private val replicaSetLister = Lister (replicaSetInformer.indexer, namespace)
2734 private val configMapLister = Lister (configMapInformer.indexer, namespace)
@@ -48,16 +55,18 @@ class ShinyProxyController(private val kubernetesClient: KubernetesClient,
4855
4956 when (event.eventType) {
5057 ShinyProxyEventType .ADD -> {
51- reconcileSingleShinyProxy(event.shinyProxy)
58+ reconcileSingleShinyProxy(event.shinyProxy, event.shinyProxyInstance )
5259 }
5360 ShinyProxyEventType .UPDATE -> {
5461 // TODO calculate hash -> reconcile
62+ reconcileSingleShinyProxy(event.shinyProxy, event.shinyProxyInstance)
5563 }
5664 ShinyProxyEventType .DELETE -> {
57- deleteSingleShinyProxy(event.shinyProxy)
65+ // DELETE is not needed
66+ // deleteSingleShinyProxy(event.shinyProxy)
5867 }
5968 ShinyProxyEventType .UPDATE_DEPENDENCY -> {
60- reconcileSingleShinyProxy(event.shinyProxy)
69+ reconcileSingleShinyProxy(event.shinyProxy, event.shinyProxyInstance )
6170 }
6271 }
6372
@@ -68,36 +77,53 @@ class ShinyProxyController(private val kubernetesClient: KubernetesClient,
6877 }
6978 }
7079
71- private fun deleteSingleShinyProxy (shinyProxy : ShinyProxy ) {
72- logger.info { " DeleteSingleShinyProxy: ${shinyProxy.metadata.name} " }
73- for (service in resourceRetriever.getServiceByLabel(APP_LABEL , shinyProxy.metadata.name)) {
74- kubernetesClient.resource(service).delete()
80+ // private fun deleteSingleShinyProxy(shinyProxy: ShinyProxy) {
81+ // logger.info { "DeleteSingleShinyProxy: ${shinyProxy.metadata.name}" }
82+ // for (service in resourceRetriever.getServiceByLabel(APP_LABEL, shinyProxy.metadata.name)) {
83+ // kubernetesClient.resource(service).delete()
84+ // }
85+ // for (replicaSet in resourceRetriever.getReplicaSetByLabel(APP_LABEL, shinyProxy.metadata.name)) {
86+ // kubernetesClient.resource(replicaSet).delete()
87+ // }
88+ // for (configMap in resourceRetriever.getConfigMapByLabel(APP_LABEL, shinyProxy.metadata.name)) {
89+ // kubernetesClient.resource(configMap).delete()
90+ // }
91+ // }
92+
93+ private suspend fun reconcileSingleShinyProxy (shinyProxy : ShinyProxy , shinyProxyInstance : ShinyProxyInstance ? ) {
94+ logger.info { " ReconcileSingleShinyProxy: ${shinyProxy.metadata.name} " }
95+
96+ if (shinyProxy.status.instances.isEmpty()) {
97+ val instance = ShinyProxyInstance ()
98+ instance.hashOfSpec = shinyProxy.calculateHashOfCurrentSpec()
99+ instance.isLatestInstance = true
100+ shinyProxy.status.instances.add(instance)
101+ shinyProxyClient.updateStatus(shinyProxy)
102+ return
75103 }
76- for (replicaSet in resourceRetriever.getReplicaSetByLabel(APP_LABEL , shinyProxy.metadata.name)) {
77- kubernetesClient.resource(replicaSet).delete()
104+
105+ if (shinyProxyInstance == null ) {
106+ TODO (" Should not happend" )
78107 }
79- for (configMap in resourceRetriever.getConfigMapByLabel(APP_LABEL , shinyProxy.metadata.name)) {
80- kubernetesClient.resource(configMap).delete()
108+
109+ if (shinyProxyInstance.hashOfSpec == null ) {
110+ TODO (" Should not happend" )
81111 }
82- }
83112
84- private suspend fun reconcileSingleShinyProxy (shinyProxy : ShinyProxy ) {
85- logger.info { " ReconcileSingleShinyProxy: ${shinyProxy.metadata.name} " }
86- val configMaps = resourceRetriever.getConfigMapByLabel(APP_LABEL , shinyProxy.metadata.name)
113+ val configMaps = resourceRetriever.getConfigMapByLabels(LabelFactory .labelsForShinyProxyInstance(shinyProxy, shinyProxyInstance))
87114 if (configMaps.isEmpty()) {
88115 logger.debug { " 0 ConfigMaps found -> creating ConfigmMap" }
89116 configMapFactory.create(shinyProxy)
90117 return
91118 }
92119
93- val replicaSets = resourceRetriever.getReplicaSetByLabel( APP_LABEL , shinyProxy.metadata.name )
120+ val replicaSets = resourceRetriever.getReplicaSetByLabels( LabelFactory .labelsForShinyProxyInstance(shinyProxy, shinyProxyInstance) )
94121 if (replicaSets.isEmpty()) {
95122 logger.debug { " 0 ReplicaSets found -> creating ReplicaSet" }
96- val configMap = configMaps[0 ]
97- replicaSetFactory.create(shinyProxy, configMap)
123+ replicaSetFactory.create(shinyProxy)
98124 return
99125 }
100- val services = resourceRetriever.getServiceByLabel( APP_LABEL , shinyProxy.metadata.name )
126+ val services = resourceRetriever.getServiceByLabels( LabelFactory .labelsForShinyProxyInstance(shinyProxy, shinyProxyInstance) )
101127 if (services.isEmpty()) {
102128 logger.debug { " 0 Services found -> creating Service" }
103129 serviceFactory.create(shinyProxy)
@@ -106,8 +132,4 @@ class ShinyProxyController(private val kubernetesClient: KubernetesClient,
106132 }
107133
108134
109- companion object {
110- const val APP_LABEL = " app"
111- }
112-
113135}
0 commit comments