140 lines
2.9 KiB
Go
140 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 {
|
|
if err := dockerEnvironment.Up(); 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
|
|
}
|