Fix infrastructure clean up on test failure
Signed-off-by: Philip Laine <philip.laine@xenit.se>
This commit is contained in:
@@ -37,6 +37,7 @@ import (
|
|||||||
"github.com/microsoft/azure-devops-go-api/azuredevops/git"
|
"github.com/microsoft/azure-devops-go-api/azuredevops/git"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
giturls "github.com/whilp/git-urls"
|
giturls "github.com/whilp/git-urls"
|
||||||
|
"go.uber.org/multierr"
|
||||||
|
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@@ -53,6 +54,11 @@ import (
|
|||||||
sourcev1 "github.com/fluxcd/source-controller/api/v1beta1"
|
sourcev1 "github.com/fluxcd/source-controller/api/v1beta1"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
aksTerraformPath = "./terraform/aks"
|
||||||
|
azureDevOpsKnownHosts = "ssh.dev.azure.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Hr1oTWqNqOlzGJOfGJ4NakVyIzf1rXYd4d7wo6jBlkLvCA4odBlL0mDUyZ0/QUfTTqeu+tm22gOsv+VrVTMk6vwRU75gY/y9ut5Mb3bR5BV58dKXyq9A9UeB5Cakehn5Zgm6x1mKoVyf+FFn26iYqXJRgzIZZcZ5V6hrE0Qg39kZm4az48o0AUbf6Sp4SLdvnuMa2sVNwHBboS7EJkm57XQPVU3/QpyNLHbWDdzwtrlS+ez30S3AdYhLKEOxAG8weOnyrtLJAUen9mTkol8oII1edf7mWWbWVf0nBmly21+nZcmCTISQBtdcyPaEno7fFQMDD26/s0lfKob4Kw8H"
|
||||||
|
)
|
||||||
|
|
||||||
type config struct {
|
type config struct {
|
||||||
kubeconfigPath string
|
kubeconfigPath string
|
||||||
kubeClient client.Client
|
kubeClient client.Client
|
||||||
@@ -90,30 +96,60 @@ type acrConfig struct {
|
|||||||
var cfg config
|
var cfg config
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
func TestMain(m *testing.M) {
|
||||||
|
exitVal, err := setup(m)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Received an error while running setup: %v", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(exitVal)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setup(m *testing.M) (exitVal int, err error) {
|
||||||
ctx := context.TODO()
|
ctx := context.TODO()
|
||||||
|
|
||||||
|
// Setup Terraform binary and init state
|
||||||
log.Println("Setting up Azure test infrastructure")
|
log.Println("Setting up Azure test infrastructure")
|
||||||
execPath, err := tfinstall.Find(ctx, &whichTerraform{})
|
execPath, err := tfinstall.Find(ctx, &whichTerraform{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("terraform exec path not found: %v", err)
|
return 0, fmt.Errorf("terraform exec path not found: %v", err)
|
||||||
}
|
}
|
||||||
tf, err := tfexec.NewTerraform("./terraform/aks", execPath)
|
tf, err := tfexec.NewTerraform(aksTerraformPath, execPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("could not create terraform instance: %v", err)
|
return 0, fmt.Errorf("could not create terraform instance: %v", err)
|
||||||
}
|
}
|
||||||
log.Println("Init Terraform")
|
log.Println("Init Terraform")
|
||||||
err = tf.Init(ctx, tfexec.Upgrade(true))
|
err = tf.Init(ctx, tfexec.Upgrade(true))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("error running init: %v", err)
|
return 0, fmt.Errorf("error running init: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Always destroy the infrastructure before exiting
|
||||||
|
defer func() {
|
||||||
|
log.Println("Tearing down Azure test infrastructure")
|
||||||
|
if ferr := tf.Destroy(ctx); ferr != nil {
|
||||||
|
err = multierr.Append(fmt.Errorf("could not destroy Azure infrastructure: %v", ferr), err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Check that we are starting from a clean state
|
||||||
|
log.Println("Checking for an empty Terraform state")
|
||||||
|
state, err := tf.Show(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return 0, fmt.Errorf("could not read state: %v", err)
|
||||||
|
}
|
||||||
|
if state.Values != nil {
|
||||||
|
return 0, fmt.Errorf("expected an empty state but got existing resources")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply Terraform and read the output values
|
||||||
log.Println("Applying Terraform")
|
log.Println("Applying Terraform")
|
||||||
err = tf.Apply(ctx)
|
err = tf.Apply(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("error running apply: %v", err)
|
return 0, fmt.Errorf("error running apply: %v", err)
|
||||||
}
|
}
|
||||||
state, err := tf.Show(ctx)
|
state, err = tf.Show(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("error running show: %v", err)
|
return 0, fmt.Errorf("could not read state: %v", err)
|
||||||
}
|
}
|
||||||
outputs := state.Values.Outputs
|
outputs := state.Values.Outputs
|
||||||
kubeconfig := outputs["aks_kube_config"].Value.(string)
|
kubeconfig := outputs["aks_kube_config"].Value.(string)
|
||||||
@@ -131,20 +167,26 @@ func TestMain(m *testing.M) {
|
|||||||
acr := outputs["acr"].Value.(map[string]interface{})
|
acr := outputs["acr"].Value.(map[string]interface{})
|
||||||
eventHubSas := outputs["event_hub_sas"].Value.(string)
|
eventHubSas := outputs["event_hub_sas"].Value.(string)
|
||||||
|
|
||||||
|
// Setup Kubernetes clients for test cluster
|
||||||
log.Println("Creating Kubernetes client")
|
log.Println("Creating Kubernetes client")
|
||||||
kubeconfigPath, kubeClient, err := getKubernetesCredentials(kubeconfig, aksHost, aksCert, aksKey, aksCa)
|
kubeconfigPath, kubeClient, err := getKubernetesCredentials(kubeconfig, aksHost, aksCert, aksKey, aksCa)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("error create Kubernetes client: %v", err)
|
return 0, fmt.Errorf("error create Kubernetes client: %v", err)
|
||||||
}
|
}
|
||||||
defer os.RemoveAll(filepath.Dir(kubeconfigPath))
|
defer func() {
|
||||||
|
if ferr := os.RemoveAll(filepath.Dir(kubeconfigPath)); ferr != nil {
|
||||||
|
err = multierr.Append(fmt.Errorf("could not clean up kubeconfig file: %v", ferr), err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Install Flux in the new cluster
|
||||||
cfg = config{
|
cfg = config{
|
||||||
kubeconfigPath: kubeconfigPath,
|
kubeconfigPath: kubeconfigPath,
|
||||||
kubeClient: kubeClient,
|
kubeClient: kubeClient,
|
||||||
azdoPat: azdoPat,
|
azdoPat: azdoPat,
|
||||||
idRsa: idRsa,
|
idRsa: idRsa,
|
||||||
idRsaPub: idRsaPub,
|
idRsaPub: idRsaPub,
|
||||||
knownHosts: "ssh.dev.azure.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Hr1oTWqNqOlzGJOfGJ4NakVyIzf1rXYd4d7wo6jBlkLvCA4odBlL0mDUyZ0/QUfTTqeu+tm22gOsv+VrVTMk6vwRU75gY/y9ut5Mb3bR5BV58dKXyq9A9UeB5Cakehn5Zgm6x1mKoVyf+FFn26iYqXJRgzIZZcZ5V6hrE0Qg39kZm4az48o0AUbf6Sp4SLdvnuMa2sVNwHBboS7EJkm57XQPVU3/QpyNLHbWDdzwtrlS+ez30S3AdYhLKEOxAG8weOnyrtLJAUen9mTkol8oII1edf7mWWbWVf0nBmly21+nZcmCTISQBtdcyPaEno7fFQMDD26/s0lfKob4Kw8H",
|
knownHosts: azureDevOpsKnownHosts,
|
||||||
fleetInfraRepository: repoConfig{
|
fleetInfraRepository: repoConfig{
|
||||||
http: fleetInfraRepository["http"].(string),
|
http: fleetInfraRepository["http"].(string),
|
||||||
ssh: fleetInfraRepository["ssh"].(string),
|
ssh: fleetInfraRepository["ssh"].(string),
|
||||||
@@ -166,22 +208,15 @@ func TestMain(m *testing.M) {
|
|||||||
},
|
},
|
||||||
eventHubSas: eventHubSas,
|
eventHubSas: eventHubSas,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = installFlux(ctx, kubeClient, kubeconfigPath, cfg.fleetInfraRepository.http, azdoPat, cfg.fluxAzureSp)
|
err = installFlux(ctx, kubeClient, kubeconfigPath, cfg.fleetInfraRepository.http, azdoPat, cfg.fluxAzureSp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("error installing Flux: %v", err)
|
return 0, fmt.Errorf("error installing Flux: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Run tests
|
||||||
log.Println("Running Azure e2e tests")
|
log.Println("Running Azure e2e tests")
|
||||||
exitVal := m.Run()
|
result := m.Run()
|
||||||
|
return result, nil
|
||||||
log.Println("Tearing down Azure test infrastructure")
|
|
||||||
err = tf.Destroy(ctx)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("error running Show: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
os.Exit(exitVal)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFluxInstallation(t *testing.T) {
|
func TestFluxInstallation(t *testing.T) {
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ require (
|
|||||||
github.com/microsoft/azure-devops-go-api/azuredevops v1.0.0-b5
|
github.com/microsoft/azure-devops-go-api/azuredevops v1.0.0-b5
|
||||||
github.com/stretchr/testify v1.7.0
|
github.com/stretchr/testify v1.7.0
|
||||||
github.com/whilp/git-urls v1.0.0
|
github.com/whilp/git-urls v1.0.0
|
||||||
|
go.uber.org/multierr v1.6.0
|
||||||
k8s.io/api v0.22.2
|
k8s.io/api v0.22.2
|
||||||
k8s.io/apimachinery v0.22.2
|
k8s.io/apimachinery v0.22.2
|
||||||
k8s.io/client-go v0.22.2
|
k8s.io/client-go v0.22.2
|
||||||
|
|||||||
Reference in New Issue
Block a user