authelia/internal/suites/suite_kubernetes.go
James Elliott 8aade7f40e
[MISC] Update durations to notation format and housekeeping (#824)
* added regulation validator
* made regulations find_time and ban_time values duration notation strings
* added DefaultRegulationConfiguration for the validator
* made session expiration and inactivity values duration notation strings
* TOTP period does not need to be converted because adjustment should be discouraged
* moved TOTP defaults to DefaultTOTPConfiguration and removed the consts
* arranged the root config validator in configuration file order
* adjusted tests for the changes
* moved duration notation docs to root of configuration
* added references to duration notation where applicable
* project wide gofmt and goimports:
* run gofmt
* run goimports -local github.com/authelia/authelia -w on all files
* Make jwt_secret error uniform and add tests
* now at 100% coverage for internal/configuration/validator/configuration.go
2020-04-05 22:37:21 +10:00

132 lines
2.9 KiB
Go

package suites
import (
"fmt"
"os"
"time"
log "github.com/sirupsen/logrus"
"github.com/authelia/authelia/internal/utils"
)
var kubernetesSuiteName = "Kubernetes"
func init() {
kind := Kind{}
kubectl := Kubectl{}
setup := func(suitePath string) error {
cmd := utils.Shell("docker-compose -p authelia -f internal/suites/docker-compose.yml -f internal/suites/example/compose/kind/docker-compose.yml build")
if err := cmd.Run(); err != nil {
return err
}
cmd = utils.Shell("docker build -t nginx-backend internal/suites/example/compose/nginx/backend")
if err := cmd.Run(); err != nil {
return err
}
exists, err := kind.ClusterExists()
if err != nil {
return err
}
if exists {
log.Debug("Kubernetes cluster already exists")
} else {
err = kind.CreateCluster()
if err != nil {
return err
}
}
log.Debug("Building authelia:dist image or use cache if already built...")
if os.Getenv("CI") != "true" {
if err := utils.Shell("authelia-scripts docker build").Run(); err != nil {
return err
}
}
log.Debug("Loading images into Kubernetes container...")
if err := loadDockerImages(); err != nil {
return err
}
log.Debug("Starting Kubernetes dashboard...")
if err := kubectl.StartDashboard(); err != nil {
return err
}
log.Debug("Deploying thirdparties...")
if err := kubectl.DeployThirdparties(); err != nil {
return err
}
log.Debug("Waiting for services to be ready...")
if err := waitAllPodsAreReady(5 * time.Minute); err != nil {
return err
}
log.Debug("Deploying Authelia...")
if err = kubectl.DeployAuthelia(); err != nil {
return err
}
log.Debug("Waiting for services to be ready...")
if err := waitAllPodsAreReady(2 * time.Minute); err != nil {
return err
}
log.Debug("Starting proxy...")
if err := kubectl.StartProxy(); err != nil {
return err
}
return nil
}
teardown := func(suitePath string) error {
kubectl.StopDashboard()
kubectl.StopProxy()
return kind.DeleteCluster()
}
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 nginx as the ingress controller.",
})
}
func loadDockerImages() error {
kind := Kind{}
images := []string{"authelia:dist", "nginx-backend"}
for _, image := range images {
err := kind.LoadImage(image)
if err != nil {
return err
}
}
return nil
}
func waitAllPodsAreReady(timeout time.Duration) error {
kubectl := Kubectl{}
// Wait in case the deployment has just been done and some services do not appear in kubectl logs.
time.Sleep(1 * time.Second)
fmt.Println("Check services are running")
if err := kubectl.WaitPodsReady(timeout); err != nil {
return err
}
fmt.Println("All pods are ready")
return nil
}