Skip to content

Commit 99df653

Browse files
committed
Put back the option to start the api without access to kubernetes
- The kubernetes api client setup can be disabled using the property 'csm.platform.kubernetesAccessEnabled=false' with a runtime error if trying to use it - If enabled, the kubernetes context can be overriden with the JVM property 'useKubernetesContext=my-context' (renamed from localKubernetesContext)
1 parent ed944d5 commit 99df653

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

src/main/kotlin/com/cosmotech/api/utils/KubernetesApiConfig.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ import io.kubernetes.client.util.ClientBuilder
88
import io.kubernetes.client.util.KubeConfig
99
import java.io.FileReader
1010
import java.io.IOException
11+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
1112
import org.springframework.context.annotation.Bean
1213
import org.springframework.context.annotation.Configuration
1314

1415
@Configuration
1516
open class KubernetesApiConfig {
1617
@Bean
18+
@ConditionalOnProperty(name = ["csm.platform.kubernetesAccessEnabled"], havingValue = "true", matchIfMissing = true)
1719
open fun coreV1Api(csmPlatformProperties: CsmPlatformProperties): CoreV1Api {
18-
val kubernetesContext = System.getProperty("localKubernetesContext")
20+
val kubernetesContext = System.getProperty("useKubernetesContext")
1921
if (kubernetesContext != null) {
2022
// Locate kube config file
2123
val kubeConfigPath =

src/main/kotlin/com/cosmotech/api/utils/KubernetesService.kt

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import org.springframework.stereotype.Service
1212
private const val SECRET_LABEL = "cosmotech.com/context"
1313

1414
@Service
15-
class KubernetesService(private val kubernetesApi: CoreV1Api) : SecretManager {
15+
class KubernetesService(private val kubernetesApi: CoreV1Api?) : SecretManager {
1616

1717
private val logger = LoggerFactory.getLogger(KubernetesService::class.java)
1818

@@ -30,22 +30,23 @@ class KubernetesService(private val kubernetesApi: CoreV1Api) : SecretManager {
3030
}
3131

3232
private fun deleteSecretFromKubernetes(namespace: String, secretName: String) {
33+
val api = checkKubernetesContext()
3334
val secretNameLower = secretName.lowercase()
3435
val labelSelector = buildLabelSector(secretNameLower)
3536

36-
val secrets =
37-
kubernetesApi.listNamespacedSecret(namespace).labelSelector(labelSelector).execute()
37+
val secrets = api.listNamespacedSecret(namespace).labelSelector(labelSelector).execute()
3838
if (secrets.items.isEmpty()) {
3939
logger.debug("Secret does not exists in namespace $namespace: cannot delete it")
4040
} else {
4141
logger.info("Secret exists in namespace $namespace: deleting it")
42-
kubernetesApi.deleteNamespacedSecret(secretNameLower, namespace).execute()
42+
api.deleteNamespacedSecret(secretNameLower, namespace).execute()
4343
}
4444
}
4545

4646
private fun getSecretFromKubernetes(namespace: String, secretName: String): Map<String, String> {
47+
val api = checkKubernetesContext()
4748
val secretNameLower = secretName.lowercase()
48-
val result = kubernetesApi.readNamespacedSecret(secretNameLower, namespace).execute()
49+
val result = api.readNamespacedSecret(secretNameLower, namespace).execute()
4950

5051
logger.debug("Secret retrieved for namespace $namespace")
5152
return result.data?.mapValues { Base64.getDecoder().decode(it.value).toString(Charsets.UTF_8) }
@@ -57,6 +58,7 @@ class KubernetesService(private val kubernetesApi: CoreV1Api) : SecretManager {
5758
secretName: String,
5859
secretData: Map<String, String>
5960
) {
61+
val api = checkKubernetesContext()
6062
logger.debug("Creating secret $secretName in namespace $namespace")
6163

6264
val secretNameLower = secretName.lowercase()
@@ -72,17 +74,20 @@ class KubernetesService(private val kubernetesApi: CoreV1Api) : SecretManager {
7274
body.data = secretData.mapValues { Base64.getEncoder().encode(it.value.toByteArray()) }
7375
body.type = "Opaque"
7476

75-
val secrets =
76-
kubernetesApi.listNamespacedSecret(namespace).labelSelector(labelSelector).execute()
77+
val secrets = api.listNamespacedSecret(namespace).labelSelector(labelSelector).execute()
7778
if (secrets.items.isEmpty()) {
7879
logger.debug("Secret does not exists in namespace $namespace: creating it")
79-
kubernetesApi.createNamespacedSecret(namespace, body).execute()
80+
api.createNamespacedSecret(namespace, body).execute()
8081
} else {
8182
logger.debug("Secret already exists in namespace $namespace: replacing it")
82-
kubernetesApi.replaceNamespacedSecret(secretNameLower, namespace, body).execute()
83+
api.replaceNamespacedSecret(secretNameLower, namespace, body).execute()
8384
}
8485
logger.info("Secret created/replaced")
8586
}
8687

88+
private fun checkKubernetesContext(): CoreV1Api {
89+
return kubernetesApi ?: throw IllegalStateException("Kubernetes API is not available")
90+
}
91+
8792
private fun buildLabelSector(secretName: String) = "$SECRET_LABEL=$secretName"
8893
}

0 commit comments

Comments
 (0)