mirror of
https://github.com/YuzuZensai/Minikura.git
synced 2026-09-13 18:59:25 +00:00
163 lines
4.8 KiB
Go
163 lines
4.8 KiB
Go
package resources
|
|
|
|
import (
|
|
"testing"
|
|
|
|
corev1 "k8s.io/api/core/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
|
v1alpha1 "github.com/YuzuZensai/Minikura/operator/api/v1alpha1"
|
|
)
|
|
|
|
func testProxy() *v1alpha1.ReverseProxyServer {
|
|
return &v1alpha1.ReverseProxyServer{
|
|
ObjectMeta: metav1.ObjectMeta{Name: "edge", Namespace: "minikura"},
|
|
Spec: v1alpha1.ReverseProxyServerSpec{
|
|
Type: v1alpha1.ProxyVelocity,
|
|
ExternalAddress: "play.example.com",
|
|
ExternalPort: 25565,
|
|
ListenPort: 25577,
|
|
Resources: v1alpha1.Resources{MemoryLimitMB: 512},
|
|
},
|
|
}
|
|
}
|
|
|
|
func TestProxyDeploymentUsesProxyImage(t *testing.T) {
|
|
container := ProxyDeployment(testProxy()).Spec.Template.Spec.Containers[0]
|
|
if container.Image != ProxyImage {
|
|
t.Errorf("image = %q, want %q", container.Image, ProxyImage)
|
|
}
|
|
}
|
|
|
|
func TestProxyEnvCarriesRuntimeConfig(t *testing.T) {
|
|
env := proxyEnv(testProxy())
|
|
for _, want := range []struct{ key, value string }{
|
|
{"TYPE", "VELOCITY"},
|
|
{"NETWORKADDRESS_CACHE_TTL", "30"},
|
|
{"MINIKURA_EXTERNAL_ADDRESS", "play.example.com"},
|
|
} {
|
|
got, ok := envValue(env, want.key)
|
|
if !ok || got != want.value {
|
|
t.Errorf("%s = %q, %v; want %q", want.key, got, ok, want.value)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestProxyConfigMap(t *testing.T) {
|
|
cm := ProxyConfigMap(testProxy())
|
|
if cm.Name != "velocity-edge-config" {
|
|
t.Errorf("name = %q", cm.Name)
|
|
}
|
|
if cm.Data["proxy-type"] != "VELOCITY" || cm.Data["external-address"] != "play.example.com" {
|
|
t.Errorf("data = %v", cm.Data)
|
|
}
|
|
}
|
|
|
|
func TestProxyService(t *testing.T) {
|
|
rp := testProxy()
|
|
svc := ProxyService(rp)
|
|
if svc.Spec.Type != corev1.ServiceTypeLoadBalancer {
|
|
t.Errorf("type = %v", svc.Spec.Type)
|
|
}
|
|
if svc.Spec.Ports[0].Port != 25565 {
|
|
t.Errorf("port = %d", svc.Spec.Ports[0].Port)
|
|
}
|
|
if svc.Spec.Ports[0].TargetPort.IntVal != 25577 {
|
|
t.Errorf("targetPort = %d", svc.Spec.Ports[0].TargetPort.IntVal)
|
|
}
|
|
}
|
|
|
|
func TestProxyServiceNodePort(t *testing.T) {
|
|
rp := testProxy()
|
|
rp.Spec.ServiceType = v1alpha1.ExposureNodePort
|
|
rp.Spec.NodePort = 30555
|
|
svc := ProxyService(rp)
|
|
if svc.Spec.Type != corev1.ServiceTypeNodePort {
|
|
t.Errorf("type = %v", svc.Spec.Type)
|
|
}
|
|
if svc.Spec.Ports[0].NodePort != 30555 {
|
|
t.Errorf("nodePort = %d", svc.Spec.Ports[0].NodePort)
|
|
}
|
|
}
|
|
|
|
func TestProxyDeploymentListenPortAndProbe(t *testing.T) {
|
|
dep := ProxyDeployment(testProxy())
|
|
container := dep.Spec.Template.Spec.Containers[0]
|
|
if container.Ports[0].ContainerPort != 25577 {
|
|
t.Errorf("containerPort = %d", container.Ports[0].ContainerPort)
|
|
}
|
|
if container.ReadinessProbe == nil || container.ReadinessProbe.TCPSocket == nil {
|
|
t.Fatal("expected TCP readiness probe")
|
|
}
|
|
if container.ReadinessProbe.TCPSocket.Port.IntVal != 25577 {
|
|
t.Errorf("probe port = %d", container.ReadinessProbe.TCPSocket.Port.IntVal)
|
|
}
|
|
}
|
|
|
|
func TestProxyAPIKeyEnv(t *testing.T) {
|
|
rp := testProxy()
|
|
rp.Spec.APIKeySecretRef = "proxy-key"
|
|
env := proxyEnv(rp)
|
|
found := false
|
|
for _, e := range env {
|
|
if e.Name == "MINIKURA_API_KEY" {
|
|
found = true
|
|
if e.ValueFrom == nil || e.ValueFrom.SecretKeyRef.Name != "proxy-key" {
|
|
t.Errorf("secret ref = %+v", e.ValueFrom)
|
|
}
|
|
if e.ValueFrom.SecretKeyRef.Optional != nil {
|
|
t.Error("API key Secret must be required")
|
|
}
|
|
}
|
|
}
|
|
if !found {
|
|
t.Error("MINIKURA_API_KEY missing")
|
|
}
|
|
}
|
|
|
|
func TestProxyPluginBackendWiring(t *testing.T) {
|
|
rp := testProxy()
|
|
rp.Spec.APIKeySecretRef = "proxy-key"
|
|
rp.Spec.BackendURL = "https://backend.example.com/api/"
|
|
rp.Spec.PluginURL = "https://downloads.example.com/minikura.jar"
|
|
rp.Spec.Env = []v1alpha1.EnvVar{
|
|
{Name: "MINIKURA_API_URL", Value: "http://attacker"},
|
|
{Name: "PLUGINS", Value: "http://attacker/plugin.jar"},
|
|
}
|
|
env := proxyEnv(rp)
|
|
want := map[string]string{
|
|
"MINIKURA_API_URL": "https://backend.example.com/api",
|
|
"MINIKURA_WEBSOCKET_URL": "wss://backend.example.com/api/servers/ws",
|
|
"PLUGINS": "https://downloads.example.com/minikura.jar",
|
|
}
|
|
for name, value := range want {
|
|
if got, ok := envValue(env, name); !ok || got != value {
|
|
t.Errorf("%s = %q, %v; want %q", name, got, ok, value)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestBungeeCordDoesNotInstallVelocityPlugin(t *testing.T) {
|
|
rp := testProxy()
|
|
rp.Spec.Type = v1alpha1.ProxyBungeeCord
|
|
rp.Spec.PluginURL = "https://downloads.example.com/minikura.jar"
|
|
if _, ok := envValue(proxyEnv(rp), "PLUGINS"); ok {
|
|
t.Error("Velocity plugin must not be installed on BungeeCord")
|
|
}
|
|
}
|
|
|
|
func TestProxyLegacyEnvWiringRemainsAvailableWhenFieldsAreUnset(t *testing.T) {
|
|
rp := testProxy()
|
|
rp.Spec.Env = []v1alpha1.EnvVar{
|
|
{Name: "MINIKURA_API_URL", Value: "http://legacy-backend/api"},
|
|
{Name: "PLUGINS", Value: "http://legacy/plugin.jar"},
|
|
}
|
|
env := proxyEnv(rp)
|
|
if got, _ := envValue(env, "MINIKURA_API_URL"); got != "http://legacy-backend/api" {
|
|
t.Errorf("legacy API URL = %q", got)
|
|
}
|
|
if got, _ := envValue(env, "PLUGINS"); got != "http://legacy/plugin.jar" {
|
|
t.Errorf("legacy plugin URL = %q", got)
|
|
}
|
|
}
|