refactor: replace wait-main-apps script with Terratest test cases

This commit is contained in:
Khue Doan
2022-10-03 12:31:16 +07:00
parent daf627849d
commit a5a6db14b6
6 changed files with 66 additions and 71 deletions

View File

@ -5,7 +5,7 @@
KUBECONFIG = $(shell pwd)/metal/kubeconfig.yaml KUBECONFIG = $(shell pwd)/metal/kubeconfig.yaml
KUBE_CONFIG_PATH = $(KUBECONFIG) KUBE_CONFIG_PATH = $(KUBECONFIG)
default: metal bootstrap external wait post-install default: metal bootstrap external smoke-test post-install
configure: configure:
./scripts/configure ./scripts/configure
@ -20,8 +20,8 @@ bootstrap:
external: external:
make -C external make -C external
wait: smoke-test:
./scripts/wait-main-apps make -C test filter=Smoke
post-install: post-install:
@./scripts/hacks @./scripts/hacks

View File

@ -56,6 +56,7 @@ More information can be found in [the roadmap](#roadmap) below.
- [ ] Monitoring and alerting 🚧 - [ ] Monitoring and alerting 🚧
- [ ] Automated offsite backups 🚧 - [ ] Automated offsite backups 🚧
- [ ] Single sign-on 🚧 - [ ] Single sign-on 🚧
- [x] Infrastructure testing
Some demo videos and screenshots are shown here. Some demo videos and screenshots are shown here.
They can't capture all the project's features, but they are sufficient to get a concept of it. They can't capture all the project's features, but they are sufficient to get a concept of it.

View File

@ -1,65 +0,0 @@
#!/usr/bin/env python
import requests
from kubernetes import client, config
from rich.console import Console
from time import sleep
# Essential services
ingresses = [
{
'name': 'argocd-server',
'fullname': 'ArgoCD',
'namespace': 'argocd'
},
{
'name': 'hajimari',
'fullname': 'Homepage',
'namespace': 'hajimari'
},
{
'name': 'vault',
'fullname': 'Vault',
'namespace': 'vault'
},
{
'name': 'gitea',
'fullname': 'Gitea',
'namespace': 'gitea'
}
]
def wait_app(name: str, fullname: str, namespace: str) -> None:
console = Console()
success = False
with console.status(f"Waiting for {fullname}"):
while not success:
try:
ingress = client.NetworkingV1Api().read_namespaced_ingress(
name,
namespace
)
url = f"https://{ingress.spec.rules[0].host}"
requests.get(url, verify=False).raise_for_status()
console.log(f"{fullname} is ready, visit {url}")
success = True
except Exception:
sleep(60)
def main() -> None:
Console().rule("Waiting for essential applications")
config.load_kube_config(config_file='./metal/kubeconfig.yaml')
requests.urllib3.disable_warnings()
for ingress in ingresses:
wait_app(ingress['name'], ingress['fullname'], ingress['namespace'])
print("There's more, but you can start exploring right away!")
if __name__ == '__main__':
main()

View File

@ -1,6 +1,8 @@
.POSIX: .POSIX:
filter=.
default: test default: test
test: test:
gotestsum --format testname -- --timeout 30m gotestsum --format testname -- -timeout 30m -run "${filter}"

57
test/smoke_test.go Normal file
View File

@ -0,0 +1,57 @@
package test
import (
"crypto/tls"
"fmt"
"testing"
"time"
http_helper "github.com/gruntwork-io/terratest/modules/http-helper"
"github.com/gruntwork-io/terratest/modules/k8s"
)
func TestSmoke(t *testing.T) {
t.Parallel()
var mainApps = []struct {
name string
namespace string
}{
{"argocd-server", "argocd"},
{"hajimari", "hajimari"},
{"vault", "vault"},
{"gitea", "gitea"},
}
for _, app := range mainApps {
app := app // https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables
t.Run(app.name, func(t *testing.T) {
t.Parallel()
options := k8s.NewKubectlOptions("", "", app.namespace)
// Wait the service to become available to ensure that we can access it
k8s.WaitUntilIngressAvailable(t, options, app.name, 10, 30*time.Second)
// Now we verify that the service will successfully boot and start serving requests
ingress := k8s.GetIngress(t, options, app.name)
// Setup a TLS configuration, ignore the certificate because we may not use cert-manager (like the sandbox environment)
tlsConfig := tls.Config{
InsecureSkipVerify: true,
}
// Test the endpoint, this will only fail if we timeout waiting for the service to return a 200 response
http_helper.HttpGetWithRetryWithCustomValidation(
t,
fmt.Sprintf("https://%s", ingress.Spec.Rules[0].Host),
&tlsConfig,
30,
30*time.Second,
func(statusCode int, body string) bool {
return statusCode == 200
},
)
})
}
}

View File

@ -31,9 +31,9 @@ func TestToolsVersions(t *testing.T) {
for _, tool := range tools { for _, tool := range tools {
params := version_checker.CheckVersionParams{ params := version_checker.CheckVersionParams{
BinaryPath: tool.binaryPath, BinaryPath: tool.binaryPath,
VersionConstraint: tool.versionConstraint, VersionConstraint: tool.versionConstraint,
WorkingDir: ".", WorkingDir: ".",
} }
version_checker.CheckVersion(t, params) version_checker.CheckVersion(t, params)