mirror of
https://github.com/0rangebananaspy/authelia.git
synced 2024-09-14 22:47:21 +07:00
a991379a74
Some tests are not fully rewritten in Go, a typescript wrapper is called instead until we remove the remaining TS tests and dependencies. Also, dockerize every components (mainly Authelia backend, frontend and kind) so that the project does not interfere with user host anymore (open ports for instance). The only remaining intrusive change is the one done during bootstrap to add entries in /etc/hosts. It will soon be avoided using authelia.com domain that I own.
123 lines
3.4 KiB
Go
123 lines
3.4 KiB
Go
package suites
|
|
|
|
import (
|
|
"fmt"
|
|
"os/exec"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/clems4ever/authelia/utils"
|
|
)
|
|
|
|
var kindImageName = "authelia-kind-proxy"
|
|
var dockerCmdLine = fmt.Sprintf("docker-compose -f docker-compose.yml -f example/compose/kind/docker-compose.yml run --rm %s", kindImageName)
|
|
|
|
// Kind used for running kind commands
|
|
type Kind struct{}
|
|
|
|
func kindCommand(cmdline string) *exec.Cmd {
|
|
cmd := fmt.Sprintf("%s %s", dockerCmdLine, cmdline)
|
|
return utils.Shell(cmd)
|
|
}
|
|
|
|
// CreateCluster create a new Kubernetes cluster
|
|
func (k Kind) CreateCluster() error {
|
|
cmd := kindCommand("kind create cluster --config /etc/kind/config.yml")
|
|
if err := cmd.Run(); err != nil {
|
|
return err
|
|
}
|
|
|
|
cmd = kindCommand("patch-kubeconfig.sh")
|
|
if err := cmd.Run(); err != nil {
|
|
return err
|
|
}
|
|
|
|
// This command is necessary to fix the coredns loop detected when using user-defined docker network
|
|
// In that case /etc/resolv.conf use 127.0.0.11 as DNS and CoreDNS thinks it is talking to itself which is wrong.
|
|
// This IP is the docker internal DNS so it is safe to disable the loop check.
|
|
cmd = kindCommand("sh -c 'kubectl -n kube-system get configmap/coredns -o yaml | grep -v loop | kubectl replace -f -'")
|
|
if err := cmd.Run(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DeleteCluster delete a Kubernetes cluster
|
|
func (k Kind) DeleteCluster() error {
|
|
cmd := kindCommand("kind delete cluster")
|
|
return cmd.Run()
|
|
}
|
|
|
|
// ClusterExists check whether a cluster exists
|
|
func (k Kind) ClusterExists() (bool, error) {
|
|
cmd := kindCommand("kind get clusters")
|
|
cmd.Stdout = nil
|
|
cmd.Stderr = nil
|
|
output, err := cmd.Output()
|
|
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
return strings.Contains(string(output), "kind"), nil
|
|
}
|
|
|
|
// LoadImage load an image in the Kubernetes container
|
|
func (k Kind) LoadImage(imageName string) error {
|
|
cmd := kindCommand(fmt.Sprintf("kind load docker-image %s", imageName))
|
|
return cmd.Run()
|
|
}
|
|
|
|
// Kubectl used for running kubectl commands
|
|
type Kubectl struct{}
|
|
|
|
// StartProxy start a proxy
|
|
func (k Kubectl) StartProxy() error {
|
|
cmd := utils.Shell("docker-compose -f docker-compose.yml -f example/compose/kind/docker-compose.yml up -d authelia-kind-proxy")
|
|
return cmd.Run()
|
|
}
|
|
|
|
// StopProxy stop a proxy
|
|
func (k Kubectl) StopProxy() error {
|
|
cmd := utils.Shell("docker-compose -f docker-compose.yml -f example/compose/kind/docker-compose.yml rm -s -f authelia-kind-proxy")
|
|
return cmd.Run()
|
|
}
|
|
|
|
// DeployThirdparties deploy thirdparty services (ldap, db, ingress controllers, etc...)
|
|
func (k Kubectl) DeployThirdparties() error {
|
|
cmd := kindCommand("sh -c 'cd /authelia && ./bootstrap.sh'")
|
|
return cmd.Run()
|
|
}
|
|
|
|
// DeployAuthelia deploy Authelia application
|
|
func (k Kubectl) DeployAuthelia() error {
|
|
cmd := kindCommand("sh -c 'cd /authelia && ./bootstrap-authelia.sh'")
|
|
return cmd.Run()
|
|
}
|
|
|
|
// WaitPodsReady wait for all pods to be ready
|
|
func (k Kubectl) WaitPodsReady(timeout time.Duration) error {
|
|
return utils.CheckUntil(5*time.Second, timeout, func() (bool, error) {
|
|
cmd := kindCommand("kubectl get -n authelia pods --no-headers")
|
|
cmd.Stdout = nil
|
|
cmd.Stderr = nil
|
|
output, _ := cmd.Output()
|
|
|
|
lines := strings.Split(string(output), "\n")
|
|
|
|
nonEmptyLines := make([]string, 0)
|
|
for _, line := range lines {
|
|
if line != "" {
|
|
nonEmptyLines = append(nonEmptyLines, line)
|
|
}
|
|
}
|
|
|
|
for _, line := range nonEmptyLines {
|
|
if !strings.Contains(line, "1/1") {
|
|
return false, nil
|
|
}
|
|
}
|
|
return true, nil
|
|
})
|
|
}
|