diff --git a/src/main/kotlin/one/oktw/galaxy/proxy/Main.kt b/src/main/kotlin/one/oktw/galaxy/proxy/Main.kt index 107d653..f8cb9b8 100644 --- a/src/main/kotlin/one/oktw/galaxy/proxy/Main.kt +++ b/src/main/kotlin/one/oktw/galaxy/proxy/Main.kt @@ -94,7 +94,7 @@ class Main { // Start lobby TODO auto scale lobby GlobalScope.launch { try { - lobby = kubernetesClient.getOrCreateGalaxyAndVolume("galaxy-lobby", config.galaxies["lobby"]!!) + lobby = kubernetesClient.getOrCreateGalaxyAndVolume("galaxy-lobby", config.galaxies["lobby"]!!, config.mongoConfig) .let { if (!Readiness.isReady(it)) kubernetesClient.waitReady(it) else it } .let { proxy.registerServer( diff --git a/src/main/kotlin/one/oktw/galaxy/proxy/config/ConfigManager.kt b/src/main/kotlin/one/oktw/galaxy/proxy/config/ConfigManager.kt index 80af706..88a6ca9 100644 --- a/src/main/kotlin/one/oktw/galaxy/proxy/config/ConfigManager.kt +++ b/src/main/kotlin/one/oktw/galaxy/proxy/config/ConfigManager.kt @@ -2,6 +2,7 @@ package one.oktw.galaxy.proxy.config import com.google.gson.Gson import one.oktw.galaxy.proxy.config.model.GalaxySpec +import one.oktw.galaxy.proxy.config.model.MongoConfig import one.oktw.galaxy.proxy.config.model.ProxyConfig import one.oktw.galaxy.proxy.config.model.RedisConfig import java.io.InputStream @@ -17,6 +18,8 @@ class ConfigManager(private val basePath: Path = Paths.get("config")) { private set lateinit var redisConfig: RedisConfig private set + lateinit var mongoConfig: MongoConfig + private set val galaxies = HashMap() init { @@ -41,6 +44,7 @@ class ConfigManager(private val basePath: Path = Paths.get("config")) { private fun readConfig() { proxyConfig = fallbackToResource("proxy.json").reader().use { gson.fromJson(it, ProxyConfig::class.java) } redisConfig = fallbackToResource("redis.json").reader().use { gson.fromJson(it, RedisConfig::class.java) } + mongoConfig = fallbackToResource("galaxies/mongo.json").reader().use { gson.fromJson(it, MongoConfig::class.java) } } private fun readGalaxies(path: Path) { diff --git a/src/main/kotlin/one/oktw/galaxy/proxy/config/model/MongoConfig.kt b/src/main/kotlin/one/oktw/galaxy/proxy/config/model/MongoConfig.kt new file mode 100644 index 0000000..cb6141f --- /dev/null +++ b/src/main/kotlin/one/oktw/galaxy/proxy/config/model/MongoConfig.kt @@ -0,0 +1,5 @@ +package one.oktw.galaxy.proxy.config.model + +data class MongoConfig( + val URI: String, +) diff --git a/src/main/kotlin/one/oktw/galaxy/proxy/event/GalaxyPacket.kt b/src/main/kotlin/one/oktw/galaxy/proxy/event/GalaxyPacket.kt index 83a4ae8..da4ebeb 100644 --- a/src/main/kotlin/one/oktw/galaxy/proxy/event/GalaxyPacket.kt +++ b/src/main/kotlin/one/oktw/galaxy/proxy/event/GalaxyPacket.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch +import one.oktw.galaxy.proxy.Main import one.oktw.galaxy.proxy.Main.Companion.main import one.oktw.galaxy.proxy.api.ProxyAPI import one.oktw.galaxy.proxy.api.packet.* @@ -71,7 +72,7 @@ class GalaxyPacket : CoroutineScope by CoroutineScope(Dispatchers.Default + Supe .let { source.sendPluginMessage(MESSAGE_CHANNEL_ID, it) } // Start galaxy - galaxy = kubernetes.getOrCreateGalaxyAndVolume(id, main.config.galaxies["normal_galaxy"]!!) // TODO multi type + galaxy = kubernetes.getOrCreateGalaxyAndVolume(id, main.config.galaxies["normal_galaxy"]!!, Main.main.config.mongoConfig) // TODO multi type // Send packet to server: Galaxy is starting ProxyAPI.encode(CreateGalaxy.CreateProgress(data.uuid, ProgressStage.Starting)) diff --git a/src/main/kotlin/one/oktw/galaxy/proxy/kubernetes/KubernetesClient.kt b/src/main/kotlin/one/oktw/galaxy/proxy/kubernetes/KubernetesClient.kt index 2fe29c7..ddebb7e 100644 --- a/src/main/kotlin/one/oktw/galaxy/proxy/kubernetes/KubernetesClient.kt +++ b/src/main/kotlin/one/oktw/galaxy/proxy/kubernetes/KubernetesClient.kt @@ -8,6 +8,7 @@ import io.fabric8.kubernetes.client.internal.readiness.ReadinessWatcher import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.withContext import one.oktw.galaxy.proxy.config.model.GalaxySpec +import one.oktw.galaxy.proxy.config.model.MongoConfig import one.oktw.galaxy.proxy.kubernetes.Templates.galaxy import one.oktw.galaxy.proxy.kubernetes.Templates.volume import java.util.concurrent.TimeUnit @@ -17,17 +18,17 @@ class KubernetesClient { suspend fun info(): VersionInfo = withContext(IO) { client.version } - suspend fun getOrCreateGalaxyAndVolume(name: String, spec: GalaxySpec): Pod { - return getGalaxy(name) ?: createGalaxy(name, spec) + suspend fun getOrCreateGalaxyAndVolume(name: String, spec: GalaxySpec, mongoConfig: MongoConfig): Pod { + return getGalaxy(name) ?: createGalaxy(name, spec, mongoConfig) } suspend fun getGalaxy(name: String): Pod? = withContext(IO) { client.pods().withName(name).get() } - suspend fun createGalaxy(name: String, spec: GalaxySpec): Pod = withContext(IO) { + suspend fun createGalaxy(name: String, spec: GalaxySpec, mongoConfig: MongoConfig): Pod = withContext(IO) { getOrCreateVolume(name, spec.Storage!!) - client.pods().create(galaxy(name, spec)) + client.pods().create(galaxy(name, spec, mongoConfig)) } suspend fun getOrCreateVolume(name: String, spec: GalaxySpec.GalaxyStorage): PersistentVolumeClaim { diff --git a/src/main/kotlin/one/oktw/galaxy/proxy/kubernetes/Templates.kt b/src/main/kotlin/one/oktw/galaxy/proxy/kubernetes/Templates.kt index c2b8505..de3f637 100644 --- a/src/main/kotlin/one/oktw/galaxy/proxy/kubernetes/Templates.kt +++ b/src/main/kotlin/one/oktw/galaxy/proxy/kubernetes/Templates.kt @@ -5,6 +5,7 @@ import com.velocitypowered.api.proxy.config.ProxyConfig import io.fabric8.kubernetes.api.model.* import one.oktw.galaxy.proxy.Main.Companion.main import one.oktw.galaxy.proxy.config.model.GalaxySpec +import one.oktw.galaxy.proxy.config.model.MongoConfig import java.nio.charset.StandardCharsets // Velocity config hack @@ -32,7 +33,7 @@ object Templates { } } - fun galaxy(name: String, spec: GalaxySpec): Pod { + fun galaxy(name: String, spec: GalaxySpec, mongoConfig: MongoConfig): Pod { requireNotNull(spec.Storage) { "Storage spec undefined!" } return newPod { @@ -52,6 +53,7 @@ object Templates { env = listOf( EnvVar("FABRIC_PROXY_SECRET", forwardSecret, null), EnvVar("resourcePack", spec.ResourcePack, null), + EnvVar("dbPath", mongoConfig.URI, null), EnvVar("GALAXY_ID", name, null) ) diff --git a/src/main/resources/config/galaxies/mongo.json b/src/main/resources/config/galaxies/mongo.json new file mode 100644 index 0000000..bc16403 --- /dev/null +++ b/src/main/resources/config/galaxies/mongo.json @@ -0,0 +1,3 @@ +{ + "URI": "mongo://localhost" +}