authelia/internal/suites/suite_kubernetes.go

141 lines
2.9 KiB
Go

package suites
import (
"os"
"time"
log "github.com/sirupsen/logrus"
"github.com/authelia/authelia/v4/internal/utils"
)
var kubernetesSuiteName = "Kubernetes"
func init() {
dockerEnvironment := NewDockerEnvironment([]string{
"internal/suites/docker-compose.yml",
"internal/suites/example/compose/k3d/docker-compose.yml",
})
k3d := K3D{}
kubectl := Kubectl{}
setup := func(suitePath string) error {
err := dockerEnvironment.Up()
if err != nil {
return err
}
err = waitUntilK3DIsReady(dockerEnvironment)
if err != nil {
return err
}
exists, err := k3d.ClusterExists()
if err != nil {
return err
}
if exists {
log.Info("Kubernetes cluster already exists")
} else {
err = k3d.CreateCluster()
if err != nil {
return err
}
}
log.Info("Building authelia:dist image or use cache if already built...")
if os.Getenv("CI") != t {
if err := utils.Shell("authelia-scripts docker build").Run(); err != nil {
return err
}
if err := utils.Shell("docker save authelia:dist -o internal/suites/example/kube/authelia-image-dev.tar").Run(); err != nil {
return err
}
}
log.Info("Loading images into Kubernetes container...")
if err := loadDockerImages(); err != nil {
return err
}
log.Info("Waiting for cluster to be ready...")
if err := waitAllPodsAreReady(namespaceKube, 5*time.Minute); err != nil {
return err
}
log.Info("Waiting for dashboard to be ready...")
err = waitAllPodsAreReady(namespaceDashboard, 2*time.Minute)
log.Info("Bearer token for UI user:")
if err := kubectl.GetDashboardToken(); err != nil {
return err
}
log.Info("Waiting for services to be ready...")
if err := waitAllPodsAreReady(namespaceAuthelia, 5*time.Minute); err != nil {
return err
}
return err
}
teardown := func(suitePath string) error {
if err := k3d.DeleteCluster(); err != nil {
return err
}
return dockerEnvironment.Down()
}
GlobalRegistry.Register(kubernetesSuiteName, Suite{
SetUp: setup,
SetUpTimeout: 12 * time.Minute,
TestTimeout: 2 * time.Minute,
TearDown: teardown,
TearDownTimeout: 2 * time.Minute,
Description: "This suite has been created to test Authelia in a Kubernetes context and using Traefik as the ingress controller.",
})
}
func loadDockerImages() error {
k3d := K3D{}
images := []string{"/authelia/authelia-image-coverage.tar"}
if os.Getenv("CI") != t {
images = []string{"/authelia/authelia-image-dev.tar"}
}
for _, image := range images {
err := k3d.LoadImage(image)
if err != nil {
return err
}
}
return nil
}
func waitAllPodsAreReady(namespace string, timeout time.Duration) error {
kubectl := Kubectl{}
log.Infof("Checking services in %s namespace are running...", namespace)
if err := kubectl.WaitPodsReady(namespace, timeout); err != nil {
return err
}
log.Info("All pods are ready")
return nil
}