http-add-on/tests/utils/setup_test.go

223 lines
7.4 KiB
Go

//go:build e2e
// +build e2e
package utils
import (
"fmt"
"os"
"os/exec"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
. "github.com/kedacore/http-add-on/tests/helper"
)
var (
OtlpConfig = `mode: deployment
image:
repository: "otel/opentelemetry-collector-contrib"
config:
exporters:
logging:
loglevel: debug
prometheus:
endpoint: 0.0.0.0:8889
receivers:
jaeger: null
prometheus: null
zipkin: null
service:
pipelines:
traces: null
metrics:
receivers:
- otlp
exporters:
- logging
- prometheus
logs: null
`
OtlpServicePatch = `apiVersion: v1
kind: Service
metadata:
name: opentelemetry-collector
spec:
selector:
app.kubernetes.io/name: opentelemetry-collector
ports:
- protocol: TCP
port: 8889
targetPort: 8889
name: prometheus
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: opentelemetry-collector
spec:
template:
spec:
containers:
- name: opentelemetry-collector
ports:
- containerPort: 8889
name: prometheus
protocol: TCP
`
)
func TestVerifyCommands(t *testing.T) {
commands := []string{"kubectl"}
for _, cmd := range commands {
_, err := exec.LookPath(cmd)
require.NoErrorf(t, err, "%s is required for setup - %s", cmd, err)
}
}
func TestKubernetesConnection(t *testing.T) {
KubeClient = GetKubernetesClient(t)
}
func TestKubernetesVersion(t *testing.T) {
out, err := ExecuteCommand("kubectl version")
require.NoErrorf(t, err, "error getting kubernetes version - %s", err)
t.Logf("kubernetes version: %s", string(out))
}
func TestSetupHelm(t *testing.T) {
_, err := exec.LookPath("helm")
if err == nil {
t.Skip("helm is already installed. skipping setup.")
}
_, err = ExecuteCommand("curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3")
require.NoErrorf(t, err, "cannot download helm installation shell script - %s", err)
_, err = ExecuteCommand("chmod 700 get_helm.sh")
require.NoErrorf(t, err, "cannot change permissions for helm installation script - %s", err)
_, err = ExecuteCommand("./get_helm.sh")
require.NoErrorf(t, err, "cannot download helm - %s", err)
_, err = ExecuteCommand("helm version")
require.NoErrorf(t, err, "cannot get helm version - %s", err)
}
func TestCreateKEDANamespace(t *testing.T) {
KubeClient = GetKubernetesClient(t)
CreateNamespace(t, KubeClient, KEDANamespace)
}
func TestSetupArgoRollouts(t *testing.T) {
KubeClient = GetKubernetesClient(t)
CreateNamespace(t, KubeClient, ArgoRolloutsNamespace)
_, err := ExecuteCommand("helm version")
require.NoErrorf(t, err, "helm is not installed - %s", err)
_, err = ExecuteCommand("helm repo add argo https://argoproj.github.io/argo-helm")
require.NoErrorf(t, err, "cannot add argo helm repo - %s", err)
_, err = ExecuteCommand("helm repo update argo")
require.NoErrorf(t, err, "cannot update argo helm repo - %s", err)
_, err = ExecuteCommand(fmt.Sprintf("helm upgrade --install %s argo/argo-rollouts --namespace %s --wait",
ArgoRolloutsName,
ArgoRolloutsNamespace))
require.NoErrorf(t, err, "cannot install argo-rollouts - %s", err)
}
func TestSetupIngress(t *testing.T) {
KubeClient = GetKubernetesClient(t)
CreateNamespace(t, KubeClient, IngressNamespace)
_, err := ExecuteCommand("helm version")
require.NoErrorf(t, err, "helm is not installed - %s", err)
_, err = ExecuteCommand("helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx")
require.NoErrorf(t, err, "cannot add ingress-nginx helm repo - %s", err)
_, err = ExecuteCommand("helm repo update ingress-nginx")
require.NoErrorf(t, err, "cannot update ingress-nginx helm repo - %s", err)
_, err = ExecuteCommand(fmt.Sprintf("helm upgrade --install %s ingress-nginx/ingress-nginx --set fullnameOverride=%s --set controller.service.type=ClusterIP --namespace %s --wait",
IngressReleaseName, IngressReleaseName, IngressNamespace))
require.NoErrorf(t, err, "cannot install ingress - %s", err)
}
func TestSetupKEDA(t *testing.T) {
_, err := ExecuteCommand("helm version")
require.NoErrorf(t, err, "helm is not installed - %s", err)
_, err = ExecuteCommand("helm repo add kedacore https://kedacore.github.io/charts")
require.NoErrorf(t, err, "cannot add kedacore helm repo - %s", err)
_, err = ExecuteCommand("helm repo update kedacore")
require.NoErrorf(t, err, "cannot update kedacore helm repo - %s", err)
_, err = ExecuteCommand(fmt.Sprintf("helm upgrade --install keda kedacore/keda --namespace %s --set extraArgs.keda.kube-api-qps=200 --set extraArgs.keda.kube-api-burst=300",
KEDANamespace))
require.NoErrorf(t, err, "cannot install KEDA - %s", err)
KubeClient = GetKubernetesClient(t)
assert.True(t, WaitForDeploymentReplicaReadyCount(t, KubeClient, "keda-operator", KEDANamespace, 1, 30, 6),
"replica count should be 1 after 3 minutes")
assert.True(t, WaitForDeploymentReplicaReadyCount(t, KubeClient, "keda-operator-metrics-apiserver", KEDANamespace, 1, 30, 6),
"replica count should be 1 after 3 minutes")
assert.True(t, WaitForDeploymentReplicaReadyCount(t, KubeClient, "keda-admission-webhooks", KEDANamespace, 1, 30, 6),
"replica count should be 1 after 3 minutes")
}
func TestSetupTLSConfiguration(t *testing.T) {
out, err := ExecuteCommandWithDir("make test-certs", "../..")
require.NoErrorf(t, err, "error generating test certs - %s", err)
t.Log(string(out))
t.Log("test certificates successfully generated")
_, err = ExecuteCommand("kubectl -n keda create secret tls keda-tls --cert ../../certs/tls.crt --key ../../certs/tls.key")
require.NoErrorf(t, err, "could not create tls cert secret in keda namespace - %s", err)
}
func TestDeployKEDAHttpAddOn(t *testing.T) {
out, err := ExecuteCommandWithDir("make deploy", "../..")
require.NoErrorf(t, err, "error deploying KEDA Http Add-on - %s", err)
t.Log(string(out))
t.Log("KEDA Http Add-on deployed successfully using 'make deploy' command")
}
func TestSetupOpentelemetryComponents(t *testing.T) {
OpentelemetryNamespace := "open-telemetry-system"
otlpTempFileName := "otlp.yml"
otlpServiceTempFileName := "otlpServicePatch.yml"
defer os.Remove(otlpTempFileName)
defer os.Remove(otlpServiceTempFileName)
err := os.WriteFile(otlpTempFileName, []byte(OtlpConfig), 0755)
assert.NoErrorf(t, err, "cannot create otlp config file - %s", err)
err = os.WriteFile(otlpServiceTempFileName, []byte(OtlpServicePatch), 0755)
assert.NoErrorf(t, err, "cannot create otlp service patch file - %s", err)
_, err = ExecuteCommand("helm version")
require.NoErrorf(t, err, "helm is not installed - %s", err)
_, err = ExecuteCommand("helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts")
require.NoErrorf(t, err, "cannot add open-telemetry helm repo - %s", err)
_, err = ExecuteCommand("helm repo update open-telemetry")
require.NoErrorf(t, err, "cannot update open-telemetry helm repo - %s", err)
KubeClient = GetKubernetesClient(t)
CreateNamespace(t, KubeClient, OpentelemetryNamespace)
_, err = ExecuteCommand(fmt.Sprintf("helm upgrade --install opentelemetry-collector open-telemetry/opentelemetry-collector -f %s --namespace %s", otlpTempFileName, OpentelemetryNamespace))
require.NoErrorf(t, err, "cannot install opentelemetry - %s", err)
_, err = ExecuteCommand(fmt.Sprintf("kubectl apply -f %s -n %s", otlpServiceTempFileName, OpentelemetryNamespace))
require.NoErrorf(t, err, "cannot update opentelemetry ports - %s", err)
}